gpt4 book ai didi

haskell - 简单的应用仿函数示例

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

我正在阅读《Learn You a Haskell》一书。我正在努力理解这个应用仿函数代码:

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

这归结为:(3+2) * (2*2) = 20

我不知道怎么做。对于新手理解版本,我可以将上述内容扩展为不太优雅但更明确的版本:
((fmap (*) (+3)) <*> (*2)) 2

我了解 <*> 的基础知识运算符(operator)。这很有意义:
class (Functor f) => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b

但是我看不到命令​​是如何工作的?有小费吗?

最佳答案

处理这类问题的一种方法是使用替换。以运算符为例,在本例中为 (<*>)或函数,获取其实现并将其插入到相关代码中。

(*) <$> (+3) <*> (*2) $ 2 的情况下您正在使用 ((->) a) Applicative 的实例发现于 the Applicative module in base ,您可以通过单击右侧的源链接并搜索“(->”来找到该实例:

instance Applicative ((->) a) where
pure = const
(<*>) f g x = f x (g x)

使用 (<*>) 的定义我们可以继续替换:
((fmap (*) (+3)) <*> (*2)) 2 == (fmap (*) (+3)) 2 ((*2) 2)
== (fmap (*) (+3)) 2 4

好的,现在我们需要 ((->) a) 的 Functor 实例.您可以通过转到 Functor 的黑线鳕信息来找到它。 , here点击右边的源码链接,搜索“(->”可以找到:
instance Functor ((->) r) where
fmap = (.)

现在继续替换:
(fmap (*) (+3)) 2 4 == ((*) . (+3)) 2 4
== (*) ((+3) 2) 4
== (*) 5 4
== 20

更具象征意义的方法

许多人在象征性地考虑这些类型的问题时报告了这些问题的长期成功。不是通过问题提供 2 值,而是关注 (*) <$> (+3) <*> (*2)并且只在最后应用 2。
(*) <$> (+3) <*> (*2)
== ((*) . (+3)) <*> (*2)
== (\x -> ((*) . (+3)) x ((*2) x))
== (\x -> ((*) . (+3)) x (x * 2))
== (\x -> (*) (x + 3) (x * 2))
== (\x -> (x + 3) * (x * 2))
== (\x -> 2 * x * x + 6 * x)

好的,现在为 x 插入 2
2 * 2 * 2 + 6 * 2
8 + 12
20

关于haskell - 简单的应用仿函数示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23924540/

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