为什么在fmap方法参数之后对getArgs求值?

时间:2019-01-04 10:47:23

标签: haskell io functor

为什么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会在之后得到特殊评价?

1 个答案:

答案 0 :(得分:4)

如果head在空白列表上中断,则意味着getArgs已完成的求值,因为值[]由{{1}生成并匹配}。

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