gpt4 book ai didi

haskell - 使 Applicative 成为 Monad 所需的 'minimum' 是什么?

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

Monad typeclass 可以用 return 来定义和 (>>=) .但是,如果我们已经有一个 Functor某些类型构造函数的实例 f ,那么这个定义在 (>>=) 中有点“超出我们的需要”和 return可用于实现 fmap所以我们没有使用 Functor我们假设的例子。
相反,定义 returnjoin似乎是一种更“最小”/更少冗余的方式来制作 f一个 Monad .这样,Functor约束是必不可少的,因为 fmap不能用这些操作来写。 (注意 join 不一定是从 FunctorMonad 的唯一最小方法:我认为 (>=>) 也可以。)
同样,Applicative可以用 pure 来定义和 (<*>) ,但是这个定义再次没有利用 Functor约束,因为这些操作足以定义 fmap .
但是,Applicative f也可以使用 unit :: f () 定义和 (>*<) :: f a -> f b -> f (a, b) .这些操作不足以定义fmap所以我会说在某种意义上这是从 Functor 出发的更简单的方法。至Applicative .
是否有 Monad 的特征?如fmap , unit , (>*<) ,以及其他一些最小的运算符,因为这些函数都不能从其他函数派生?

  • (>>=)不起作用,因为它可以实现 a >*< b = a >>= (\ x -> b >>= \ y -> pure (x, y))在哪里 pure x = fmap (const x) unit .
  • join 也没有自从 m >>= k = join (fmap k m)所以(>*<)可以如上实现。
  • 我怀疑 (>=>)同样失败。
  • 最佳答案

    我有东西,我想。它远非优雅,但至少足以让你摆脱困境。我从 join :: m (m a) -> ??? 开始并问“它会产生什么需要 (<*>) 才能回到 m a ?”,我发现了一条富有成效的思路,可能有更多的战利品。
    如果你引入一个新类型T只能在 monad 内部构造:

    t :: m T
    然后你可以定义一个类似连接的操作,它需要这样的 T :
    joinT :: m (m a) -> m (T -> a)
    我们可以生成 T 的唯一方法我们需要去甜蜜的,甜蜜的 a里面是使用 t ,然后我们必须将其与 joinT 的结果相结合不知何故。有两个基本操作可以结合两个 m合二为一: (<*>)joinT -- fmap没有帮助。 joinT行不通,因为我们只需要另一个 T使用它的结果,所以 (<*>)是唯一的选项,这意味着 (<*>)不能用 joinT 来定义.
    如果你愿意的话,你可以把这一切都卷成一个存在主义。
    joinT :: (forall t. m t -> (m (m a) -> m (t -> a)) -> r) -> r

    关于haskell - 使 Applicative 成为 Monad 所需的 'minimum' 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64920988/

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