instance Monad (Either e) where
return = Right
Right m >>= k = k m
Left e >>= _ = Left e
我找到了这样一段代码。这对我来说是不可理解的,因为毕竟Either
构造函数类型有两个参数(Either a b
)并且在这里
拿了一个。我不明白为什么有可能。
答案 0 :(得分:8)
与Haskell一样,类型构造函数与普通函数一样。这意味着你可以给一个带有两个参数的构造函数,比如Either
,一个参数,结果是一个类型构造函数,只需要一个参数来构造一个完整的Either
。
Monad
类型类不是针对简单类型,而是针对采用一个参数的类型构造函数。例如,您有instance Monad Maybe
,但Maybe
不是类型,它是一个带有一个参数的类型构造函数。所以你不能使Either
成为Monad
的实例,因为它需要两个参数,而不是一个,并且你不能使Either a b
成为一个实例,因为它不带参数。您可以使Either a
成为monad的实例。
在Haskell中,我们说一个简单类型有类*
,一个类型构造函数接受一个参数,如Maybe
类型* -> *
,Either
类型* -> * -> *
1}}。 Monad
想要一些善意的* -> *
,并通过向Either
提供一种类型,这就是你得到的。