在Haskell中,有没有办法限制monad M a
以a
满足类型类约束?
我正在将概率建模示例从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
?
谢谢.
看来我在Haskell遇到了一个众所周知的问题.我通过Google搜索"受限制的monad" 找到了许多变通方法.这种解决方案似乎是破坏性最小的.不过,就我的目的而言,这似乎有些过分.我认为我将保持monad的一般性,并通过受限制的功能简化支持,如Revolucent所建议的那样.Distribution
我对此的理解是你根本不能,因为monad意味着对所有类型进行推广,而不是某些类型的有限子集,例如(Ord a)
.
M a
您可以简单地限制使用该monadic类型的函数,而不是限制monadic类型,例如,
foo :: Ord a => Int -> M a
实际上,最好将类型保持为尽可能通用,并仅使用类型类来限制函数.
等等