Haskell:模式匹配绑定运算符时的刚性类型变量错误

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很新,不明白为什么这不起作用.


编辑:对不起,这是一个糟糕的例子.假设>> =的第一个定义给出了不同的输出.

Sar*_*rah 8

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.