gpt4 book ai didi

haskell - liftM 可以与 liftA 不同吗?

转载 作者:行者123 更新时间:2023-12-03 09:11:02 30 4
gpt4 key购买 nike

根据the Typeclassopedia (以及其他来源),Applicative逻辑上属于 MonadPointed (因此 Functor )在类型类层次结构中,所以如果 Haskell 前奏是今天写的,我们理想情况下会有这样的东西:

class Functor f where
fmap :: (a -> b) -> f a -> f b

class Functor f => Pointed f where
pure :: a -> f a

class Pointed f => Applicative f where
(<*>) :: f (a -> b) -> f a -> f b

class Applicative m => Monad m where
-- either the traditional bind operation
(>>=) :: (m a) -> (a -> m b) -> m b
-- or the join operation, which together with fmap is enough
join :: m (m a) -> m a
-- or both with mutual default definitions
f >>= x = join ((fmap f) x)
join x = x >>= id
-- with return replaced by the inherited pure
-- ignoring fail for the purposes of discussion

(这些默认定义是我从 explanation at Wikipedia 重新键入的,错误是我自己的,但如果有错误,至少原则上是可能的。)

由于当前定义了库,因此我们有:
liftA :: (Applicative f) => (a -> b) -> f a -> f b
liftM :: (Monad m) => (a -> b) -> m a -> m b

和:
(<*>) :: (Applicative f) => f (a -> b) -> f a -> f b
ap :: (Monad m) => m (a -> b) -> m a -> m b

请注意每对中这些类型之间的相似性。

我的问题是:是 liftM (不同于 liftA )和 ap (与 <*> 不同),仅仅是 Monad 的历史现实的结果。不是用 Pointed 设计的和 Applicative心里?或者它们是否以某种其他行为方式(可能对于某些合法的 Monad 定义)不同于仅需要 Applicative 的版本?语境?

如果它们是不同的,您能否提供一组简单的定义(遵守 MonadApplicativePointedFunctor 在 Typeclassopedia 和其他地方描述但未由类型系统强制执行的定义所要求的法律) liftAliftM表现不同?

或者,如果它们不是不同的,您能否使用与前提相同的定律证明它们的等价性?

最佳答案

liftA , liftM , fmap , 和 .应该都是相同的函数,如果它们满足仿函数定律,它们必须是:

fmap id = id

然而,这并没有被 Haskell 检查。

现在申请。 ap 是可能的和 <*>对于某些仿函数来说是不同的,仅仅因为可能有多个实现满足类型和定律。例如,List 有多个可能的 Applicative实例。您可以如下声明一个应用程序:
instance Applicative [] where
(f:fs) <*> (x:xs) = f x : fs <*> xs
_ <*> _ = []
pure = repeat
ap函数仍将定义为 liftM2 id ,即 Applicative每个 Monad 免费提供的实例.但是这里有一个类型构造函数的示例,它具有多个 Applicative例如,两者都满足法律。但是如果你的 monad 和你的 applicative functors 不同意,那么为它们设置不同的类型被认为是一种很好的形式。例如, Applicative上面的实例不同意 [] 的 monad ,所以你真的应该说 newtype ZipList a = ZipList [a]然后为 ZipList 创建新实例而不是 [] .

关于haskell - liftM 可以与 liftA 不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1634911/

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