为什么在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
不安全,您应该检查列表中是否存在至少一个参数。