【问题标题】:Restricting a monad to a type class将 monad 限制为类型类
【发布时间】:2010-09-27 15:08:12
【问题描述】:

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

我正在将probabilistic modeling exampleF# 翻译成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。有没有办法让我有一个单子Distribution,但在这个单子上强制约束(Ord a)?我试过了:

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.

所以有办法拥有一个单子M a,但用Ord a之类的约束来限制a

谢谢。

【问题讨论】:

  • 我相信您可以使用 ConstraintKinds 语言扩展和 ConstraintKinds 包来做到这一点,请参阅 here 以获取受约束的 monad,以及 here FunctorConstraint

标签: haskell types monads typeclass


【解决方案1】:

看来我在 Haskell 中遇到了一个众所周知的问题。我found many workaroundsgoogling for "restricted monads"This solutions 似乎是破坏性最小的。尽管如此,就我的目的而言,这似乎有点过分了。我想我会保留Distribution monad 的通用性,并通过 Revolucent 的建议通过受限功能简化支持。

【讨论】:

  • “破坏性最小”的解决方案不只是 free monad 的一个特例吗? (我知道这个解决方案在免费的 monad 热潮之前就已经发布了)。
【解决方案2】:

我对此的理解是,您根本无法做到,因为 monad 旨在推广到所有类型,而不是某些类型的受限子集,例如 (Ord a)

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

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

事实上,最好保持类型尽可能通用,只使用类型类来限制功能。

等等

【讨论】:

    【解决方案3】:

    查看Martin Erwig's library, PFP:

    PFP 库是 Haskell 的模块集合,可促进概率函数式编程,即使用随机值进行编程。概率函数编程方法基于用于表示分布的数据类型。分布将概率事件的结果表示为所有可能值的集合,并标有它们的可能性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多