gpt4 book ai didi

haskell - 了解如何应用 haskell 应用仿函数

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

我只是有一个关于应用仿函数的快速问题,以帮助我掌握它们。这只是我在 ghci 中应用的东西。

[(+3),((-) 3),(*3)] <*> [4]
[7,-1,12]

这对我来说很有意义。基本应用。但是在尝试时:

[(Just (+3)),(Just ((-) 3)),(Just (*3))] <*> [Just 4]

我收到大量错误。我有点理解为什么;有两个数据构造函数( []Maybe )和 <*>功能仅“剥离”其中之一。我想帮助我理解的是 haskell 在失败之前到底试图一步一步地做什么,以及如何绕过它并成功地计算到:

[(Just 7),(Just -1),(Just 12)]

最佳答案

你有两个不同的Applicative实例。确实如此

Just (* 3) <*> Just 4 == Just 12

但是[]实例只是尝试将第一个列表中的每个“函数”应用到第二个列表中的每个值,因此您最终尝试应用

(Just (* 3)) (Just 4)

这是一个错误。

(更准确地说,您的 Just 值列表的类型错误,无法用作 <*> 的第一个参数。)

相反,您需要映射 <*>在第一个列表上。

> (<*>) <$> [(Just (+3)),(Just ((-) 3)),(Just (*3))] <*> [Just 4]
[Just 7,Just (-1),Just 12]

(在列表上映射高阶函数通常是您首先获得包装函数列表的方式。例如,

> :t [(+3), ((-) 3), (* 3)]
[(+3), ((-) 3), (* 3)] :: Num a => [a -> a]
> :t Just <$> [(+3), ((-) 3), (* 3)]
Just <$> [(+3), ((-) 3), (* 3)] :: Num a => [Maybe (a -> a)]

)


Data.Functor.Compose评论中提到的是另一种选择。

> import Data.Functor.Compose
> :t Compose [(Just (+3)),(Just ((-) 3)),(Just (*3))]
Compose [(Just (+3)),(Just ((-) 3)),(Just (*3))]
:: Num a => Compose [] Maybe (a -> a)
> Compose [(Just (+3)),(Just ((-) 3)),(Just (*3))] <*> Compose [Just 4]
Compose [Just 12,Just (-1),Just 12]
> getCompose <$> Compose [(Just (+3)),(Just ((-) 3)),(Just (*3))] <*> Compose [Just 4]
[Just 12,Just (-1),Just 12]

Compose的定义很简单:

newtype Compose f g a = Compose { getCompose: f (g a) }

神奇的是只要fg都是(应用)仿函数,那么 Compose f g 也是一个(应用)仿函数。

instance (Functor f, Functor g) => Functor (Compose f g) where
fmap f (Compose x) = Compose (fmap (fmap f) x)

instance (Applicative f, Applicative g) => Applicative (Compose f g) where
pure x = Compose (pure (pure x))
Compose f <*> Compose x = Compose ((<*>) <$> f <*> x)

Applicative例如,您可以看到 (<*>) <$> ... 的相同用法我在上面使用的。

关于haskell - 了解如何应用 haskell 应用仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54928844/

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