Haskell 如何读取编译器错误
我为自定义类型编写了Monad的实现:Haskell 如何读取编译器错误,haskell,Haskell,我为自定义类型编写了Monad的实现: data Sum a b = First a | Second b deriving (Eq, Show) instance Functor (Sum a) where fmap _ (First x) = First x fmap f (Second y) = Second (f y) instance Applicative (Sum a) where pure = Second
data Sum a b =
First a
| Second b
deriving (Eq, Show)
instance Functor (Sum a) where
fmap _ (First x) = First x
fmap f (Second y) = Second (f y)
instance Applicative (Sum a) where
pure = Second
First x <*> _ = First x
_ <*> First x = First x
Second f <*> Second x = Second (f x)
instance Monad (Sum a) where
return = pure
(First a) >>= _ = First a
(Second a) >>= k = Second (k a)
如何读取编译器错误
* Couldn't match type `b' with `Sum a b'
翻译:我(编译器)期望ab
而得到a和b
`b' is a rigid type variable bound by
the type signature for:
(>>=) :: forall a1 b. Sum a a1 -> (a1 -> Sum a b) -> Sum a b
翻译:由于>=
的签名,类型变量b
的具体类型值不能由您选择,只能由调用方选择。您不能只给我任何类型的值,而期望b
将表达式的类型作为其类型值(请记住b
是一个类型变量)
翻译:为了让你更容易理解,我给你多一点上下文。我期望aSum a b
而你递给我aSum a(Sum a b)
。您现在已经可以看到,问题在这里以粗体显示
(>>=) :: forall a1 b. Sum a a1 -> (a1 -> Sum a b) -> Sum a b
给你更多的背景。我(编译器)不喜欢这个表达式
Second (k a)
在方程式中
(Second a) >>= k = Second (k a)
这里您可以推断,Second(ka)
的类型是suma(sumb)
而不是sumb
还有更多对您有用的信息:
* Relevant bindings include
k :: a1 -> Sum a b
(bound at D:\haskell\chapter18\src\SumMonad.hs:39:20)
(>>=) :: Sum a a1 -> (a1 -> Sum a b) -> Sum a b
(bound at D:\haskell\chapter18\src\SumMonad.hs:38:5)
翻译:ka
的结果已经是a和a b
,你看到了吗?因此,如果你想起我的前一条(希望是有用的消息),Second(ka)
将是sumab(sumab)
,而不是我已经告诉过你的sumab
Second (k a)
(Second a) >>= k = Second (k a)
* Relevant bindings include
k :: a1 -> Sum a b
(bound at D:\haskell\chapter18\src\SumMonad.hs:39:20)
(>>=) :: Sum a a1 -> (a1 -> Sum a b) -> Sum a b
(bound at D:\haskell\chapter18\src\SumMonad.hs:38:5)