gpt4 book ai didi

haskell - (r ->) 应用仿函数

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

我在理解函数实例 (->) r 时遇到了一些麻烦。 Haskell 中的应用程序。

例如,如果我有

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

我知道你得到的结果是 508,我有点理解你得到 (5 + 3) 的结果和 (5 * 100)然后你申请 (+)对这两者起作用。

但是我不太明白发生了什么。我假设表达式用括号括起来,如下所示:
((+) <$> (+3)) <*> (*100)

据我了解,正在发生的事情是您的映射 (+)超过 (+3) 的最终结果然后你正在使用 <*>运算符将该函数应用于 (*100) 的最终结果

但是我不明白 <*> 的实现对于 (->) r实例以及为什么我不能写:
(+3) <*> (*100)
<*> 如何, <$>运算符(operator)工作时 (->) r ?

最佳答案

<$>只是 fmap 的另一个名称及其对(->) r 的定义是 (.) (组合运算符):

intance Functor ((->) r) where
fmap f g = f . g

您基本上可以制定 <*> 的实现只需查看类型:
instance Applicative ((->) r) where
(<*>) :: (r -> a -> b) -> (r -> a) -> (r -> b)
f <*> g = \x -> f x (g x)

你有一个来自 r 的函数至 ab以及来自 r 的函数至 a .您想要 r 的功能至 b因此。你知道的第一件事是你返回一个函数:
\x ->

现在你要申请 f因为它是唯一可能返回 b 的项目:
\x -> f _ _

现在是 f 的参数属于 r 类型和 a . r简直是 x (因为它已经属于 r 类型,您可以通过将 a 应用于 g 来获得 x:
\x -> f x (g x)

Aaand 你完成了。 Here's a link to the implementation in Haskell's Prelude .

关于haskell - (r ->) 应用仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38778320/

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