gpt4 book ai didi

haskell - Functor 类中 (<$) 的目的是什么?

转载 作者:行者123 更新时间:2023-12-04 00:39:02 24 4
gpt4 key购买 nike

Functor类包含一个隐藏的第二个成员:

class Functor f where
fmap :: (a -> b) -> f a -> f b
(GHC.Base.<$) :: a -> f b -> f a

文档:

Replace all locations in the input with the same value. The default definition is fmap . const, but this may be overridden with a more efficient version.



我想知道更多。为什么这个 fmap . const成语是独立的成员吗?替代实现如何更有效?这个组合器有什么应用?

最佳答案

它作为一个成员包含在允许用户自定义它的速度,我猜是因为它使它与 >> 一致。 .

我认为在 reader monad ((->) r) 的情况下它可能会更快.

x <$ _ = const x

对比
x <$ fa = fmap (const x) fa = (const x) . fa

虽然,这确实是编译器优化的问题。而且,它似乎没有为 base 中的 reader monad 定义。

它还可能导致严格集合的性能提升。即
data Strict a = Strict !a

instance Functor Strict where
fmap f (Strict a) = Strict (f a)
x <$ _ = Strict x

这不符合仿函数定律,但尽管如此,您可能希望在某些情况下这样做。

第三个例子来自无限集合。考虑无限列表
data Long a = Cons a (Long a)

instance Functor Long where
fmap f (Cons x xs) = Cons (f x) (fmap f xs)

效果很好,但想想
countUpFrom x = Cons x (countUpFrom (x+1))
ones = 1 <$ (countUpFrom 0)

现在,我们的定义将扩展到
ones = 1 <$ (countUpFrom 0)
= fmap (const 1) (countUpFrom 0)
= Cons (const 1 0) (fmap (const 1) (countUpFrom 1)
= Cons (const 1 0) (Cons (const 1 1) (fmap (const 1) (countUpFrom 2))

也就是说,它将分配一大堆 Cons遍历此列表时的单元格。而另一方面,如果你定义
x <$ _ = let xs = Cons x xs in xs


ones = 1 <$ countUpFrom 0
= let xs = Cons 1 xs in xs

这已经打结了。一个更极端的例子是无限树
data ITree a = ITree a (ITree a) (ITree a)

关于haskell - Functor 类中 (<$) 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14087881/

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