一个论点是两个人。或

时间:2016-04-02 17:04:03

标签: haskell

instance Monad (Either e) where
        return = Right
        Right m >>= k = k m
        Left e  >>= _ = Left e

我找到了这样一段代码。这对我来说是不可理解的,因为毕竟Either构造函数类型有两个参数(Either a b)并且在这里 拿了一个。我不明白为什么有可能。

1 个答案:

答案 0 :(得分:8)

与Haskell一样,类型构造函数与普通函数一样。这意味着你可以给一个带有两个参数的构造函数,比如Either,一个参数,结果是一个类型构造函数,只需要一个参数来构造一个完整的Either

Monad类型类不是针对简单类型,而是针对采用一个参数的类型构造函数。例如,您有instance Monad Maybe,但Maybe不是类型,它是一个带有一个参数的类型构造函数。所以你不能使Either成为Monad的实例,因为它需要两个参数,而不是一个,并且你不能使Either a b成为一个实例,因为它不带参数。您可以使Either a成为monad的实例。

在Haskell中,我们说一个简单类型有类*,一个类型构造函数接受一个参数,如Maybe类型* -> *Either类型* -> * -> * 1}}。 Monad想要一些善意的* -> *,并通过向Either提供一种类型,这就是你得到的。