【发布时间】:2012-05-06 21:12:52
【问题描述】:
我有以下
[3,2,1] >> [1]
= [1,1,1]
我不完全明白为什么会发生这种情况?看着 >> 我希望 [3,2,1] 是结果,但我发现这在列表中有所不同。
谁能解释一下原因?
【问题讨论】:
-
想想会发生什么,
IOmonad 确实以类似的方式表现...putStr "Hello," >> putStr " world"将是一个打印仅" world"的操作。 -
如果您解释了为什么您期望得到您建议的结果,这可能会有所帮助。
-
@leftaroundabout:想想
(>>) :: Monad m => m a -> m b -> m b的类型。就IO而言,这将是“分别组合IO a和IO b类型的两个动作,并产生IO b类型的动作”。想想(getLine >> getLine) :: IO String:它从标准输入中读取两行,丢弃读取第一行的结果,返回读取第二行的结果。([3,2,1] >> ["Hello", "World"]) :: [String]类似:选择一个数字,然后选择一个字符串,然后返回字符串,隐式丢弃该数字。 -
@sacundim:我的观点与丢弃的“返回”单子参数数据无关(这就是我选择输出动作的原因,因为那些只有
()),它是关于结构. -
@leftaroundabout:我想我在得到你的回复之前就明白了你的意思。我刚刚提交了您可能感兴趣的this question。