Zan*_*ier 4 monads haskell pattern-matching
我正试图这样做
newtype Test a = Test (Int, a)
instance Monad Test where
Test (_, []) >>= k =
k []
Test (_, a) >>= k =
k a
return a =
Test (0, a)
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Couldn't match expected type `a' with actual type `[t0]'
`a' is a rigid type variable bound by
the type signature for >>= :: Test a -> (a -> Test b) -> Test b
at C:\Users\david.phillips\Documents\code\test.hs:4:5
In the pattern: []
In the pattern: (_, [])
In the pattern: Test (_, [])
Run Code Online (Sandbox Code Playgroud)
当我尝试使用case语句而不是2个版本的>>时,我收到类似的错误.
我对haskell很新,不明白为什么这不起作用.
编辑:对不起,这是一个糟糕的例子.假设>> =的第一个定义给出了不同的输出.
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
(>>) :: m a -> m b -> m b
return :: a -> m a
fail :: String -> m a
Run Code Online (Sandbox Code Playgroud)
Monad实例在类型变量上进行参数化a.你本质上声称它不是,因为在该变量的位置,你在空列表构造函数上有模式匹配[],意思是"a是某个列表".例如的类型.bind可以通过明确的量化来编写:
(>>=) :: forall a. m a -> (a -> m b) -> m b
你的定义不可能适用于所有人a.
| 归档时间: |
|
| 查看次数: |
1018 次 |
| 最近记录: |