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