Подтвердить что ты не робот

Нет ли стандартного (или a) экземпляра монады?

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

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

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

-------------- EDIT ---------------

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

В соответствии с базой 4.6 экземпляр находится в Data.Either.

Ответ 4

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