gpt4 book ai didi

haskell - 需要多少个 fmap?

转载 作者:行者123 更新时间:2023-12-02 16:49:57 27 4
gpt4 key购买 nike

一个comment丹尼尔·瓦格纳(Daniel Wagner)的著作让我想到了这个问题。让我们从过度简化开始。假设你有一个类型

data Foo a = Foo [a]

然后你可以编写Functor实例

instance Functor Foo where
fmap f (Foo l) = Foo (fmap f l)

您可以将右侧重写为

Foo . fmap f $ l

认识到对于(->) afmap = (.),你可以这样写

fmap Foo (fmap f) l

重复,你会得到

fmap (fmap Foo) fmap f l

最后,

fmap f (Foo l) =
fmap fmap fmap Foo fmap f l
<小时/>

如果您选择一个稍微复杂一点的仿函数会怎样?

data Bar = Bar [Maybe a]

instance Functor Bar where
fmap f (Bar l) = Bar (fmap (fmap f) l)

我开始手动执行此操作,但它开始失去控制,所以我切换到自动。

infixl 9 :@
data Expr
= BAR | F | L | FMap | Expr :@ Expr
deriving (Show)

rewrite :: Expr -> Expr
rewrite (p :@ (q :@ r))
= rewrite $ FMap :@ p :@ q :@ r
rewrite (p :@ q) = rewrite p :@ q
rewrite e = e

main = print $ rewrite $
BAR :@ (FMap :@ (FMap :@ F) :@ L)

不幸的是,这似乎产生了非常巨大的结果。我什至无法在合理的时间内计算出树最左边的叶子。这到底是多大的表情?随着更多仿函数分层,它的增长速度有多快?

最佳答案

无限。以下术语循环您的重写器:

FMap :@ ((FMap :@ (FMap :@ FMap)) :@ FMap)

只需三个步骤即可完成此操作,分别是:

((FMap :@ FMap) :@ (FMap :@ (FMap :@ FMap))) :@ FMap
(((FMap :@ (FMap :@ FMap)) :@ FMap) :@ (FMap :@ FMap)) :@ FMap
(((FMap :@ ((FMap :@ (FMap :@ FMap)) :@ FMap)) :@ FMap) :@ FMap) :@ FMap

最后一个词的开头是原始术语。 (原始循环术语本身是在重写 BAR :@ (FMap :@ (FMap :@ F) :@ L) 六个步骤后出现的。)

关于haskell - 需要多少个 fmap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55566397/

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