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

Why is getArgs evaluated after fmap method argument?

为什么 getArgsfmap 的方法参数之后被求值?

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 did 已经计算,因为值 [] 已生成并匹配通过 head.

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