gpt4 book ai didi

haskell - 为什么 Control.Arrow 中没有 Kleisli 的 Functor 实例?

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

在尝试熟悉Control.Arrow时,我注意到 Kleisli newtype 似乎会承认一个 Functor 实例,例如:

instance Monad m => Functor (Kleisli m a) where
fmap f (Kleisli k) = Kleisli $ liftM f . k

没有提供此实例是否有原因?它是否作为孤立实例存在于某个包中?

最佳答案

通过定义,每个箭头都可以成为有效的仿函数

fmap f a = a >>> arr f

但是,不可能将 Functor 声明为 Arrow 的父类(super class),因为它们的类型不同(Functor 需要 * -> *Arrow 需要 * -> * -> *)。所以每个箭头都需要单独定义实例。

您可以使用 ArrowMonad 包裹任何箭头,然后它会给出一个 Applicative 实例(因此也是一个 Functor): instance箭头 a => 应用 (ArrowMonad a) 其中...

我没有看到 Kleisli 缺少 Functor 实例的任何特殊原因。最有可能的是您不需要它。如果你想使用仿函数(或应用或单子(monad))操作,你可以在原始单子(monad)上进行。仅当需要箭头接口(interface)时,才将 monad 包装到 Kleisli 中。

关于haskell - 为什么 Control.Arrow 中没有 Kleisli 的 Functor 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18925045/

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