为什么在 fmap 方法参数之后评估 getArgs?
Why is getArgs evaluated after fmap method argument?
为什么 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
did 已经计算,因为值 []
已生成并匹配通过 head
.
很可能你运行你的程序来自ghci
,可以产生这样的效果。由于 head
不安全,您应该检查列表中是否至少存在一个参数。
为什么 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
did 已经计算,因为值 []
已生成并匹配通过 head
.
很可能你运行你的程序来自ghci
,可以产生这样的效果。由于 head
不安全,您应该检查列表中是否至少存在一个参数。