gpt4 book ai didi

haskell - 帮助理解无点代码

转载 作者:行者123 更新时间:2023-12-03 14:03:29 24 4
gpt4 key购买 nike

当玩Pointfree我看到了一段我似乎无法理解的代码。

:pl map (\x -> x * x) [1..10]
-- map (join (*)) [1..10]

我的主要问题是我不明白 join在这里工作。我知道它“删除”了一层单子(monad)包装( m (m a)m a )。我认为它可以归结为 [1..10] >>= (\x -> [x * x]) ,但我真的不明白“额外层”是如何引入的。我明白了 join x = x >>= id ,但是我仍然坚持如何“复制”每个值,以便 (*)得到两个参数。这已经困扰了我大约半个小时了,我主要对自己感到恼火,因为我觉得我拥有所有的拼图,但似乎无法将它们组合在一起......

附言别担心,我不会真正使用这个无点版本,这纯粹是出于好奇,也是为了更好地理解 Haskell。

最佳答案

join正在使用 Monad 的实例对于 (->) a ,如 Control.Monad.Instances 中所定义.实例类似于 Reader ,但没有明确的包装。它是这样定义的:

instance Monad ((->) a) where
-- return :: b -> (a -> b)
return = const
-- (>>=) :: (a -> b) -> (b -> a -> c) -> (a -> c)
f >>= g = \x -> g (f x) x

如果你现在减少 join使用这个实例:
join
(>>= id)
flip (\f g x -> g (f x) x) (\a -> a)
(\f x -> (\a -> a) (f x) x)
(\f x -> f x x)

如您所见, (->) a 的实例使 join应用于两次应用参数的函数。正因为如此, join (*)简直是 \x -> x * x .

关于haskell - 帮助理解无点代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6797247/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com