gpt4 book ai didi

haskell - monoid 和 applicative 是如何连接的?

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

我正在阅读 haskellbook关于应用程序并试图理解它。

在书中,作者提到:

So, with Applicative, we have a Monoid for our structure and function application for our values!



幺半群如何连接到应用程序?

最佳答案

备注:我不拥有这本书(还),而且 IIRC,至少有一位作者在 SO 上很活跃,应该能够回答这个问题。话虽这么说,monoid(或者更确切地说是半群)背后的想法是,您有一种方法可以从该 monoid1 中的两个对象创建另一个对象:

mappend :: Monoid m => m -> m -> m

那么 Applicative怎么样一个幺半群?好吧,正如您的引述所说,就其结构而言,它是一个幺半群。也就是说,我们从 f something 开始。 , 继续 f anotherthing ,我们得到,你已经猜到了 f resulthing :
amappend :: f (a -> b) -> f a -> f b

在我们继续之前,很短很短的时间,让我们忘记 f有样 * -> * .我们最终会得到什么?
amappend :: f          -> f   -> f

那是“单调结构”部分。这就是 Applicative 之间的区别。和 Functor在 Haskell 中,因为 Functor我们没有那个属性:
fmap     ::   (a -> b) -> f a -> f b
-- ^
-- no f here

这也是我们尝试使用 (+) 时遇到麻烦的原因。或具有 fmap 的其他功能仅:在单个 fmap 之后我们被困住了,除非我们能以某种方式在那个新结构中应用我们的新功能。这将我们带到您问题的第二部分:

So, with Applicative, we have [...] function application for our values!



功能申请是 ($) .如果我们看看 <*> ,我们可以立即看到它们是相似的:
($)   ::   (a -> b) ->   a ->   b
(<*>) :: f (a -> b) -> f a -> f b

如果我们忘记了 f(<*>) , 我们最终得到 ($) .所以 (<*>)只是我们结构上下文中的函数应用:
increase  :: Int -> Int
increase x = x + 1

five :: Int
five = 5

increaseA :: Applicative f => f (Int -> Int)
increaseA = pure increase

fiveA :: Applicative f => f Int
fiveA = pure 5

normalIncrease = increase $ five
applicativeIncrease = increaseA <*> fiveA

我猜这就是作者所说的“功能应用程序”的意思。我们突然可以将那些隐藏在我们结构中的函数应用到我们结构中的其他值上。由于单调的性质,我们停留在那个结构中。

话虽如此,我个人永远不会称它为单拨号,因为 <*>不对相同类型的两个参数进行操作,并且应用程序缺少空元素。

1 对于一个真正的半群/幺半群,该操作应该是关联的,但这在这里并不重要

关于haskell - monoid 和 applicative 是如何连接的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45010424/

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