【发布时间】:2011-07-22 23:45:40
【问题描述】:
在玩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,但是我仍然坚持如何“复制”每个值,以便(*) 得到两个参数。这已经困扰了我大约半小时了,我主要是对自己感到恼火,因为我觉得我拥有所有的拼图,但似乎无法将它们组合在一起......
附:别担心,我不会真的使用这个无点版本,这纯粹是出于好奇,也是为了更好地理解 Haskell。
【问题讨论】:
-
join :: m (m a) -> m a并没有完全“移除”一层单子包裹,更准确地说是将两层压缩成一层。因此这个名字,确实......