gpt4 book ai didi

haskell - 无吊的定义

转载 作者:行者123 更新时间:2023-12-03 15:06:38 25 4
gpt4 key购买 nike

我对 Haskell 库中的函数 liftfree 有一些疑问 Control.Monad.Free .给定一个变换f在两个仿函数之间,hoistfree f 在相应的自由单子(monad)之间产生一个态射。这是它的定义。

hoistFree :: Functor g => (forall a. f a -> g a) -> Free f b -> Free g b
hoistFree _ (Pure a) = Pure a
hoistFree f (Free as) = Free (hoistFree f <$> f as)

问题一 Haskell 怎么知道 <$>是与 g 关联的 map 而不是 f , Free fFree g ?

问题2 为什么没有将提升自由定义为
hoistFree :: Functor g => (forall a. f a -> g a) -> Free f b -> Free g b
hoistFree _ (Pure a) = Pure a
hoistFree f (Free as) = Free (f (hoistFree f <$> as))

?

如果 f是自然变换,这两个定义重合。然而,第二个定义总是满足关系
hoistfree f = iter (wrap . f) . map return

这看起来很自然。此外,还有一些基本功能可以用 iter_map f g = iter f . map g 表示。 .例如,
(=<<) f = iter_map wrap f

问题3 iter_map 是否在某处定义?它看起来像一个monadic mapreduce。我在基础库中没有看到它。融合 iter 和 map 有什么好处吗?在其他一些语言中,情况就是这样,但我不确定 Haskell。

最佳答案

问题一

由于类型推断,它选择 <$>来自 g .的确,在

Free (hoistFree f <$> f as)
f as有类型 g <something> ,因此 <$>Functor g 给出的那个.

问题2

我认为,在 Haskell 中, f总是一种自然的转变。任何多态函数 f a -> g a必须是自然的 a ,通过参数/自由定理。
两个定义是等效的,我不确定是否有一个是“最好的”。也许你的就是。或者,也许原始的在实践中具有更好的性能。它看起来有点像 foldr对比 foldl'关于关联运算符的争论​​,没有明确的赢家。

问题3 不知道。

关于haskell - 无吊的定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39495993/

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