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)
这可能很简单,但我无法弄清楚!
类型变量m不是你可以模式匹配的东西,尤其不是为了区分Just和Nothing.想想它对于代替使用的不同可能类型意味着什么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,你应该.
| 归档时间: |
|
| 查看次数: |
164 次 |
| 最近记录: |