为什么在fmap方法参数后评估getArgs?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么在fmap方法参数后评估getArgs?相关的知识,希望对你有一定的参考价值。

为什么在getArgs的方法参数之后对fmap进行评估?

main::IO()
main=do
    fpath<-fmap head getArgs
    putStrLn fpath

我得到错误:Exception: Prelude.head: empty list它似乎适用于尚未计算的东西。

我首先假设它可能是另一个关于懒惰的规则,我不知道是Haskell的新手所以我尝试过: a<-fmap head getLine#没问题 a<-fmap head (readFile [filename])#再次没问题

那么为什么getArgs特别值得评估之后呢?

答案

如果head在空列表中打破,这意味着getArgs已经评估过了,因为[]生成并匹配head

很可能你从ghci运行你的程序,它可以产生这样的效果。由于head不安全,您应该检查列表中是否存在至少一个参数。

以上是关于为什么在fmap方法参数后评估getArgs?的主要内容,如果未能解决你的问题,请参考以下文章

getArgs如何工作?

getarg 命令行输入参数

为啥我们有map、fmap和liftM?

困惑(fmap length Just)[1,1,1,1] vs. fmap length $ Just [1,1,1,1]

在haskell中拆分使用和不使用fmap的输入读取的行

关于通过多个嵌套功能级别进行映射