当前位置:  开发笔记 > 编程语言 > 正文

将monad限制为类型类

如何解决《将monad限制为类型类》经验,为你挑选了2个好方法。

在Haskell中,有没有办法限制monad M aa满足类型类约束?

我正在将概率建模示例从F#转换为Haskell.但是,在Haskell中,我省略了support因为它会data Distribution a改为data (Ord a) => Distribution a.通过此更改,我收到以下错误:

...probabilisticModeling.hs:42:13:
    Could not deduce (Ord a) from the context ()
      arising from a use of `always'
                   at ...probabilisticModeling.hs:42:13-18
    Possible fix:
      add (Ord a) to the context of the type signature for `return'
    In the expression: always
    In the definition of `return': return = always
    In the instance declaration for `Monad Distribution'

的确,always/ 的类型return是:(Ord a) => a -> Distribution a.有没有办法让我有一个monad Distribution,但强迫(Ord a)这个monad 的约束?我试过了:

instance Monad Distribution where
    (>>=) = bind
    return :: (Ord a) => a -> Distribution a = always

但我得到错误:

...probabilisticModeling2.hs:48:4:
    Pattern bindings (except simple variables) not allowed in instance declarations
      return :: (Ord a) => a -> Distribution a = always
Failed, modules loaded: none.

所以它有一种方法来拥有一个monad M a,但限制了a一个约束,如Ord a

谢谢.



1> namin..:

看来我在Haskell遇到了一个众所周知的问题.我通过Google搜索"受限制的monad" 找到了许多变通方法.这种解决方案似乎是破坏性最小的.不过,就我的目的而言,这似乎有些过分.我认为我将保持monad的一般性,并通过受限制的功能简化支持,如Revolucent所建议的那样.Distribution



2> Gregory Higl..:

我对此的理解是你根本不能,因为monad意味着对所有类型进行推广,而不是某些类型的有限子集,例如(Ord a).

M a您可以简单地限制使用该monadic类型的函数,而不是限制monadic类型,例如,

foo :: Ord a => Int -> M a

实际上,最好将类型保持为尽可能通用,并仅使用类型类来限制函数.

等等

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有