Haskell >> 带有两个列表的运算符

Seb*_*ink 4 monads haskell list ghci sequencing

对于大学作业,我正在学习 Haskell,当阅读有关 do-notation 和排序的内容时>>=>>我遇到了这种我没有预料到的行为。

[1,2,3] >> [1] -- returns [1,1,1]
Run Code Online (Sandbox Code Playgroud)

谁能解释为什么第一个数组的每个元素都被第二个数组的元素替换?似乎列表以某种方式连接起来,而我预计第一个表达式的结果将被完全忽略,因此我期望[1]结果。

预先非常感谢。

lef*_*out 7

在这种情况下, \xe2\x80\x9cresult\xe2\x80\x9d 是 中包含的值[1,2,3],它们确实被忽略。>>不能忽略的是context 对于列表 monad 来说,它是列表的形状(即长度)。这不能被忽视,因为我们必须有x >>= pure \xe2\x89\xa1 x,即

\n
Prelude> [1,2,3] >>= pure\n[1,2,3]\nPrelude> [1,2,3] >>= \\n -> [n]\n[1,2,3]\nPrelude> [1,2,3] >>= \\n -> [1]\n[1,1,1]\nPrelude> [1,2,3] >>= \\_ -> [1]\n[1,1,1]\nPrelude> [1,2,3] >> [1]\n[1,1,1]\n
Run Code Online (Sandbox Code Playgroud)\n

RHS 上长度>1 的示例:

\n
[1,2,3] >>= \\n -> [n, n+10]\n[1,11,2,12,3,13]\nPrelude> [1,2,3] >>= \\n -> [100, 10]\n[100,10,100,10,100,10]\nPrelude> [1,2,3] >> [100, 10]\n[100,10,100,10,100,10]\n
Run Code Online (Sandbox Code Playgroud)\n