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

标签 haskell functor monad-transformers applicative

我想制作不同类型的嵌套应用仿函数。例如,不同类型的嵌套简单仿函数(在 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/

相关文章:

python - Python 中的 Haskell 风格的递归惰性列表

c++ - 将仿函数作为函数指针传递

haskell - Haskell中有态射吗?

c++ - 检查类型是否是包含泛型 lambda 的仿函数

design-patterns - 有人在野外遇到过 Monad Transformer 吗?

haskell - 用 `ParsecT` 进行排列解析?

haskell - Haskell 中的 Goto : Can anyone explain this seemingly insane effect of continuation monad usage?

unit-testing - Haskell Test.Framework 指定从命令行运行的测试数量

haskell - 在 Windows 上构建 GHC 时出错

haskell - haskell-stack 出现奇怪的错误。它不再安装任何东西