Разве нет стандартного (Либо) экземпляра монады?

У меня сложилось впечатление, что где-то был экземпляр Either a, но я не могу его найти. Я попытался импортировать Control.Monad, Control.Monad.Instances и Data.Either, как показано

module Main where

import Control.Monad
import Data.Either
import Control.Monad.Instances

test :: [Either a b] -> Either a [b]
test = sequence

main = return ()

но GHC говорит мне, что он не мог вывести (Monad (либо A)). Добавление

instance Monad (Either a) where
    return = Right
    Right b >>= f = f b
    Left a >>= _ = Left a

делает компиляцию кода, но это объявление экземпляра кажется настолько общим, что для меня не имеет смысла, если его нет в каком-то стандартном модуле. Если это так, то где мне искать его, а если нет, то есть ли причина для этого?

-------------- РЕДАКТИРОВАТЬ ---------------

Имейте в виду, что теперь я думаю, что ответ пользователя 31708 ниже ("Начиная с базы 4.6, экземпляр находится в Data.Either.") В настоящее время является правильным ответом. Я не уверен в правильности протокола переназначения выбранного ответа в этом случае, когда выбранный ответ был правильным ответом на момент, когда был задан вопрос, поэтому я оставил его как есть. Пожалуйста, поправьте меня, если есть другое руководство для этого.

4 ответа

Решение

Этот экземпляр был добавлен в base 4.3.x.x, который идет с ghc 7, Между тем, вы можете использовать Either экземпляр, или, если вы используете Either представлять что-то, что может потерпеть неудачу, вы должны использовать ErrorT монадный трансформатор.

Начиная с версии 4.6, экземпляр находится в Data.Either сам.

Там нет экземпляра для Either a, но есть для Either String в Control.Monad.Error, (На самом деле, это для Error e => Either eIIRC).

Я верю, что что-то есть в Control.Monad.Error - не надо ничего проверять.

Другие вопросы по тегам