gpt4 book ai didi

haskell - 我在实现EitherT catamorphism 时在哪里引入了额外的monadic 结构?

转载 作者:行者123 更新时间:2023-12-03 14:06:06 24 4
gpt4 key购买 nike

我正在尝试从第一原则 - 26.3 - Ex 5 编写 Haskell 编程的解决方案。

问题是编写一个适用于 monad 转换器变体的任一个 catamorphism 版本,EitherT。函数的类型应该是:

eitherT :: Monad m => (e -> m c) -> (a -> m c) -> EitherT e m a -> m c

作为引用,这是书中定义的EitherT newtype:
newtype EitherT e m a = --why does the book use e a for the type parameters instead of a b? Error type?
EitherT {runEitherT :: m (Either e a)}

另外,我有一个工作 instance Monad m => Monad (EitherT e m) ,以及它之前的 Functor 和 Applicative。

问题陈述中给出的类型签名表明我需要使用 m 的 Monadic 功能,或者可能是 (EitherT e m)。但是,我编写了一个仅使用 fmap 的版本,我认为它可以工作:
eitherT :: Monad m => (e -> m c) -> (a -> m c) -> EitherT e m a -> m c
eitherT fe fa = fmap (either fe fa) . runEitherT

这不编译。具体来说,编译器提示我构造了无限类型 c ~ mc (完整输出如下)。我将把它作为另一个线索,表明这个问题是要通过一些 monadic 函数来解决的。但是,我想了解我的方法在该结构中添加的位置。到目前为止,我不能。

这是我对我编写的代码的推理:
  • runEitherT :: EitherT e m a -> m (Eihter e a)
  • either fe fa :: Either e a -> c
  • fmap (either fe fa) :: m (Either e a) -> m c
  • fmap (either fe fa) . runEitherT :: EitherT e m a -> m c

  • 这似乎与 eitherT fe fa 的类型完全匹配.

    有人能指出我哪里出错了吗?

    完整的错误信息:
     Haskell> :l EitherT.hs 
    [1 of 1] Compiling EitherT ( EitherT.hs, interpreted )

    EitherT.hs:36:17: error:
    * Occurs check: cannot construct the infinite type: c ~ m c
    Expected type: EitherT e m a -> m c
    Actual type: EitherT e m a -> m (m c)
    * In the expression: fmap (either fe fa) . runEitherT
    In an equation for `eitherT':
    eitherT fe fa = fmap (either fe fa) . runEitherT
    * Relevant bindings include
    fa :: a -> m c (bound at EitherT.hs:36:12)
    fe :: e -> m c (bound at EitherT.hs:36:9)
    eitherT :: (e -> m c) -> (a -> m c) -> EitherT e m a -> m c
    (bound at EitherT.hs:36:1)
    |
    36 | eitherT fe fa = fmap (either fe fa) . runEitherT
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    Failed, no modules loaded.

    最佳答案

    好吧,我在查看问题格式时找到了答案。如果它帮助其他人,这里是:

    如果 fe 的类型,我的解决方案有效和 fa形式为 (a -> c)而不是 (a -> m c) .

    更改 anyT 的类型签名以反射(reflect)允许代码编译。我推理中的具体缺陷在第 2 步中,应该是:

  • either fe fa :: Either e a -> m c
  • 关于haskell - 我在实现EitherT catamorphism 时在哪里引入了额外的monadic 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56998130/

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