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

相关内容

最新更新