我试着这样写:
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
您无法A
为Monad
给定其当前定义的实例。
错误消息告诉您,编译器期望使用某种类型的东西* -> *
。这意味着一个类型采用一个类型作为输入,像Maybe a
,IO a
或[] a
。换句话说,类型必须是参数多态的。
为了更直观地了解这一点,请考虑return
以下类型:
return :: a -> m a
类型参数a
不受限制。这意味着您应该能够接受任何类型的值a
并将其转换为多态类型的值。
如果我给你一个布尔值False
,A
你会从中构造哪个值?如果我给您字符串"foo"
,A
您将从中构造哪个值?如果我给您该函数id
,A
您将从中构造哪个值?
如果要使类型成为Monad
实例,则必须为其提供类型参数,至少像这样:
data A a = A Int deriving Show
在这里,a
类型参数是幻像角色。它没有被使用,但是现在您至少可以将其设置为Functor
。此版本A
与Const函子同构。您可以将其设为Functor
andApplicative
实例,但可以将其设为Monad
?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句