在尝试使用Pointfree期间,我遇到了一段代码,但似乎无法理解。
:pl map (\x -> x * x) [1..10]
-- map (join (*)) [1..10]
我的主要问题是我不太明白这里的join
函数是如何工作的。我了解它可以"去除"单子包装的一层(从m (m a)
到m a
)。我觉得它归结为类似于[1..10] >>= (\x -> [x * x])
这样的东西,但我真的不明白“额外层”是如何被引入的。我知道join x = x >>= id
,但我仍然不知道它是如何将每个值“复制”以使(*)
获得两个参数的。这已经在困扰我大约半个小时了,而且我主要是对自己感到恼火,因为我觉得我已经有所有的拼图,但似乎无法将它们拼接起来...附言:别担心,我并不会真的使用这个pointfree版本,这只是出于纯好奇和试图更好地理解Haskell。
join :: m (m a) -> m a
并不是真正意义上的“去除”单子层,更准确地说,它将两个层压缩成一个。因此得名,确实如此... - Ben Millwood