gpt4 book ai didi

haskell - Haskell 中不同类型的嵌套应用仿函数

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

我想制作不同类型的嵌套应用仿函数。例如,不同类型的嵌套简单仿函数(在 ghci 中)可以正常工作:

Prelude> ((+2) <$>) <$> (Just [1..4])
Just [3,4,5,6]

但是对于不同类型的应用仿函数:

Prelude> ((*) <$>)  <$> (Just [1,2,3]) <*> (Just [4,5,6,7])

<interactive>:56:1: error:
* Couldn't match type `[Integer -> Integer]' with `[Integer] -> b'

不工作!我想获得这样的东西:

Just [4,5,6,7,8,10,12,14,12,15,18,21]

我知道应用仿函数处于仿函数和单子(monad)之间的中间位置。我可以将此练习视为有关 monad 转换器主题之前的初步练习。

最佳答案

除了嵌套提升和 fmap 之外,组成应用仿函数的另一个选项是 Data.Functor.Compose新类型:

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

例如:

ghci> let Compose result = (*) <$> Compose (Just [1,2,3]) <*> Compose (Just [4,5,6,7])
ghci> result
Just [4,5,6,7,8,10,12,14,12,15,18,21]

Applicative 的行为非常良好,以至于单个新类型足以组合任意两个作为实例的类型。除了嵌套之外,还有其他方法可以组合它们,例如 ProductDay卷积:

data Product f g a = Pair (f a) (g a)

data Day f g a = forall b c. Day (f b) (g c) (b -> c -> a)

Monad 的组合性较差,因此我们需要为每个 monad 提供一个不同的新类型,以便用第一个 monad 的能力来增强其他一些 monad。我们将这些新类型称为 monad 转换器。

关于haskell - Haskell 中不同类型的嵌套应用仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53680453/

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