Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何读取编译器错误_Haskell - Fatal编程技术网

Haskell 如何读取编译器错误

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

我为自定义类型编写了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
    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'
翻译:我(编译器)期望a
b
而得到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
是一个类型变量)

翻译:为了让你更容易理解,我给你多一点上下文。我期望a
Sum a b
而你递给我a
Sum 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)