gpt4 book ai didi

haskell - ap fromMaybe 是如何组成的?

转载 作者:行者123 更新时间:2023-12-02 18:09:13 28 4
gpt4 key购买 nike

我正在编写一个函数,该函数接受一个值作为输入,在该输入上调用一个函数,如果结果是Just x,它应该返回x;否则,它应该返回原始输入。

换句话说,这个函数(我不知道该调用什么):

foo :: (a -> Maybe a) -> a -> a
foo f x = fromMaybe x (f x)

由于它看起来像一个通用函数,我想知道它是否尚未定义,所以 I asked on Twitter ,和Chris Allen replied这是ap fromMaybe

这听起来很有希望,所以我启动了 GHCI 并开始试验:

Prelude Control.Monad Data.Maybe> :type ap
ap :: Monad m => m (a -> b) -> m a -> m b
Prelude Control.Monad Data.Maybe> :type fromMaybe
fromMaybe :: a -> Maybe a -> a
Prelude Control.Monad Data.Maybe> :type ap fromMaybe
ap fromMaybe :: (b -> Maybe b) -> b -> b

ap fromMaybe 的类型看起来确实是正确的,并且一些实验似乎表明它也具有所需的行为。

但是它是如何工作的?

fromMaybe 函数对我来说似乎很清楚,并且单独来看,我认为我理解 ap 的作用 - 至少在 Maybe 的上下文中>。当mMaybe时,它的类型为Maybe (a -> b) -> Maybe a -> Maybe b

我不明白的是 ap fromMaybe 是如何编译的。对我来说,这个表达式看起来像是部分应用,但我可能会弄错。但是,如果是这种情况,我不明白类型如何匹配。

ap 的第一个参数是 m (a -> b),但 fromMaybe 的类型为 a -> Maybe一个->一个。那如何匹配?编译器推断出 m 是哪个 Monad 实例?带有两个(柯里化(Currying))参数的 fromMaybe 如何变成带有单个参数的函数?

有人可以帮我把这些点联系起来吗?

最佳答案

但是使用apMaybe 的上下文中。我们将它与函数 fromMaybe 一起使用。 ,所以它是在函数的上下文中,其中

ap f g x = f x (g x)

各种Monad我们拥有的实例

instance Monad ((->) r)

原来如此

ap :: Monad m =>    m  (a       -> b)  ->    m  a  ->    m  b
fromMaybe :: r -> (Maybe r -> r)
ap :: (r -> (a -> b)) -> (r -> a) -> (r -> b)
ap f g x :: b
ap fromMaybe :: (r -> a) -> (r -> b) , a ~ Maybe r , b ~ r

因为->在类型中与右侧关联:a -> b -> c ~ a -> (b -> c) 。尝试将这些类型连接在一起,我们只能得到上面的定义。

并与 (<*>) :: Applicative f => f (a -> b) -> f a -> f b ,我们可以将其写为(fromMaybe <*>) ,如果你喜欢这种涂鸦:

 #> :t (fromMaybe <*>)
(fromMaybe <*>) :: (r -> Maybe r) -> r -> r
<小时/>

正如此处另一个答案中正确指出的那样,当与函数一起使用时,<*>就是你的好'S combinator 。我们不能很好地拥有名为 S 的函数在 Haskell 中,所以 <*>只是无点编码风格的标准轨道的一部分。单子(monad)绑定(bind)(更是如此,翻转),=<< ,可能更加神秘,但是 pointfree 编码器并不关心,并且会很乐意使用它来编码另一个类似的模式,

(f =<< g) x = f (g x) x 

combinatory函数调用,神秘与否(我想到了zipWith (-) =<< drop 1)。

关于haskell - ap fromMaybe 是如何组成的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34622482/

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