如何写这个简单的Monad?

wang kai

我试着这样写:

data A=A Int deriving Show

instance Monad A where
 return x=A x
 A x>>=f=f x

main=print a where a=A 1

我从《学到伟大的Haskell》一书中学到了:

instance Monad Maybe where
 return x = Just x
 Nothing >>= f = Nothing
 Just x >>= f = f x
 fail _ = Nothing

但出现错误:

a.hs:3:16: error:
? Expected kind ‘* -> *’, but ‘A’ has kind ‘*’
? In the first argument of ‘Monad’, namely ‘A’
  In the instance declaration for ‘Monad A’

那怎么写呢?完成后,我可以写

A 1>>\x->x+1

得到A 2

马克·西曼

您无法AMonad给定其当前定义的实例

错误消息告诉您,编译器期望使用某种类型的东西* -> *这意味着一个类型采用一个类型作为输入,像Maybe aIO a[] a换句话说,类型必须是参数多态的

为了更直观地了解这一点,请考虑return以下类型:

return :: a -> m a

类型参数a不受限制。这意味着您应该能够接受任何类型的值a并将其转换为多态类型的值。

如果我给你一个布尔值FalseA你会从中构造哪个值?如果我给您字符串"foo"A您将从中构造哪个值?如果我给您该函数idA您将从中构造哪个值?

如果要使类型成为Monad实例,则必须为其提供类型参数,至少像这样:

data A a = A Int deriving Show

在这里,a类型参数是幻像角色。它没有被使用,但是现在您至少可以将其设置为Functor此版本AConst函子同构您可以将其设为FunctorandApplicative实例,但可以将其设为Monad

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章