gpt4 book ai didi

haskell - Haskell 中的这个仿函数是什么意思?

转载 作者:行者123 更新时间:2023-12-05 09:25:51 28 4
gpt4 key购买 nike

如何解释这个表达式?

:t (+) <$> (+3) <*> (*100)

<$><$>具有相同的优先级并且是左结合的。我认为这与 ((+) <$> (+3)) <*> (*100) 相同.但是,我不知道它的作用。在 Learn You a Haskell for Great Good , 据说

When we do (+) <$> (+10) <*> (+5), we're using + on the future return values of (+10) and (+5), and the result is also something that will produce a value only when called with a parameter.

听起来是右结合的。谁能解释一下?

最佳答案

表达式:

(+) <$> (+3) <*> (*100)

将使用 FunctorApplicative Haskell 中函数 的实例。事实上,a -> b(->) a b 的缩写与 (->)类型构造函数。所以我们可以将实例定义为 Functor (->) a使用函数。 Functor  [src] Applicative  [src]实例定义为:

instance Functor ((->) r) where
fmap = (.)

instance Applicative ((->) r) where
pure = const
(<*>) f g x = f x (g x)
liftA2 q f g x = q (f x) (g x)

fmap因此,在函数上充当“后处理器”:它转换函数 a -> b进入函数a -> c如果第一个操作数是函数 b -> c通过将该函数应用于第一个函数的结果。

Applicative将采用两个函数 f :: a -> b -> cg :: a -> b从而构造一个映射 x 的函数在 f x (g x) .

如果我们这样看表达式:

(+) <$> (+3) <*> (*100)

那么这相当于:

(<*>) (fmap (+) (+3)) (*100)

fmap因此相当于(.) ,所以这是:

(<*>) ((+) . (+3)) (*100)

或:

(<*>) (\x -> ((x+3) +)) (*100)

相当于:

\y -> (\x -> ((x+3) +)) y ((*100) y)

我们可以将其简化为:

\y -> (y+3) +) (y*100)

因此:

\y -> (y+3) + (y*100)

它因此产生一个函数将映射 yy + 3 + (y * 100) .因此它将适用y到两个(+3)(*100)然后由于 (+) 将它们加在一起在 <$> 之前.

一般规则是这样的:

g <$> f1 <*> f2 <*> … <*> fn

f<sub>i</sub> :: a -> b<sub>i</sub><strong>g</strong> :: b<sub>1</sub> -> b<sub>2</sub> -> … -> b<sub>n</sub> -> c , 然后它创建一个函数来映射一个变量 x<strong>g</strong> (f<sub>1</sub> x) (f<sub>2</sub> x) … (f<sub>n</sub> x) .

关于haskell - Haskell 中的这个仿函数是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74999007/

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