【问题标题】:Monad Transformer 'distribute' FunctionMonad Transformer 'distribute' 函数
【发布时间】:2015-04-15 02:41:30
【问题描述】:

给定以下Typeclassopedia 练习:

--Implement join :: M (N (M (N a))) -> M (N a), 
--given distrib :: N (M a) -> M (N a) and 
--assuming M and N are instances of Monad.

distrib :: (Monad m, Monad n) => n (m a) => m (n a)
distrib = undefined

我收到以下编译时错误。

ghci> :l MonadTransformers.hs
[1 of 1] Compiling Main             ( MonadTransformers.hs, interpreted )

MonadTransformers.hs:7:34:
    Expected a constraint, but `n (m a)' has kind `*'
    In the type signature for `distrib':
      distrib :: (Monad m, Monad n) => n (m a) => m (n a)
Failed, modules loaded: none.

我该如何解决?

【问题讨论】:

    标签: haskell


    【解决方案1】:

    应该是这样的

    distrib :: (Monad m, Monad n) => n (m a) -> m (n a)
    

    => 介于约束和类型的其余部分之间。

    -> 是函数的中缀类型构造函数。

    例如

    (+) :: Num a => a -> a -> a
           -----     \  /      \
            \         arguments result
             constraint
    

    【讨论】:

    • 我将=> 归咎于~~Scala~~(我自己)。谢谢
    • Kevin Meredith:是的,我想在 Scala 中,约束是(隐式)参数并没有帮助。
    • Haskell 中的约束是否也被解析为隐式?
    • 有点像。类型类约束由编译器转换为字典参数。调用时使用哪个字典由类型推断确定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多