nam*_*min 15 monads haskell types typeclass
在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'
Run Code Online (Sandbox Code Playgroud)
的确,always
/ 的类型return
是:(Ord a) => a -> Distribution a
.有没有办法让我有一个monad Distribution
,但强迫(Ord a)
这个monad 的约束?我试过了:
instance Monad Distribution where
(>>=) = bind
return :: (Ord a) => a -> Distribution a = always
Run Code Online (Sandbox Code Playgroud)
但我得到错误:
...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.
Run Code Online (Sandbox Code Playgroud)
所以它有一种方法来拥有一个monad M a
,但限制了a
一个约束,如Ord a
?
谢谢.
nam*_*min 13
看来我在Haskell遇到了一个众所周知的问题.我通过Google搜索"受限制的monad" 找到了许多变通方法.这种解决方案似乎是破坏性最小的.不过,就我的目的而言,这似乎有些过分.我认为我将保持monad的一般性,并通过受限制的功能简化支持,如Revolucent所建议的那样.Distribution
Gre*_*ley 10
我对此的理解是你根本不能,因为monad意味着对所有类型进行推广,而不是某些类型的有限子集,例如(Ord a)
.
M a
您可以简单地限制使用该monadic类型的函数,而不是限制monadic类型,例如,
foo :: Ord a => Int -> M a
实际上,最好将类型保持为尽可能通用,并仅使用类型类来限制函数.
等等