实例声明上的模式匹配错误

nic*_*oan 2 monads haskell instance

我需要为特定数据类型声明一个Monad实例:

data M m a = Mk (m (Maybe a))

instance (Monad m) => Monad (M m) where
  return x = Mk (m (Just x))
  Mk (m (Nothing)) >>= f = Mk (m (Nothing))
  Mk (m (Just x)) >>= f = f x
Run Code Online (Sandbox Code Playgroud)

但我得到:

test.hs:6:7: Parse error in pattern: m
Failed, modules loaded: none.
Run Code Online (Sandbox Code Playgroud)

这可能很简单,但我无法弄清楚!

C. *_*ann 5

类型变量m不是你可以模式匹配的东西,尤其不是为了区分JustNothing.想想它对于代替使用的不同可能类型意味着什么m- 在很多情况下,这样的模式匹配是完全不可能的.

要编写该实例,您需要这样的东西:

instance (Monad m) => Monad (M m) where
  return x = Mk (return (Just x))
  Mk mx >>= f = -- ??
Run Code Online (Sandbox Code Playgroud)

注意return用于创建类型的值m (Maybe a)- 由于Monad m约束可能,并且在一般情况下(根本没有约束),没有办法创建这样的值.

要实现(>>=)你需要做同样的事情,同样利用的(>>=)Monad实例m.

顺便说一句,你应该考虑使用newtypefor M,除非你有特殊的理由想要data.大多数情况下,如果你可以使用newtype,你应该.