16

どこかにどちらかのインスタンスがあるような印象を受けましたが、見つからないようです。示されているように、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はそれが推論できなかったと私に言います(モナド(どちらか))。追加する

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

コードをコンパイルしますが、このインスタンス宣言は非常に一般的であるため、標準モジュールにまだ存在していない場合は意味がありません。もしそうなら、どこでそれを見つけるべきですか、そうでなければ、これには理由がありますか?

- - - - - - - 編集 - - - - - - - -

以下のuser31708による回答(「ベース4.6の時点では、インスタンスはData.Either自体にあります。」)が現在正しい回答であると私が考えていることに注意してください。この場合、選択された回答が質問された時点で正解であった場合、選択された回答を再割り当てする適切なプロトコルがわからないため、そのままにしておきます。これに関する別のガイドラインがある場合は、私を訂正してください。

4

4 に答える 4

18

このインスタンスは、に追加されていbase 4.3.x.xますghc 7。一方、Eitherインスタンスを直接使用Eitherすることも、失敗する可能性のあるものを表すために使用している場合は、ErrorTモナド変換子を使用する必要があります。

于 2011-02-25T00:57:24.517 に答える
6

ベース4.6の時点では、インスタンス自体が存在しData.Eitherます。

于 2015-08-15T07:14:57.957 に答える
5

のインスタンスはありませんが、のインスタンスはEither aありEither StringますControl.Monad.Error。(実際にはError e => Either e、IIRC用です)。

于 2011-02-25T00:28:48.810 に答える
1

何かがあると思いますが、チェックするものはありませんControl.Monad.Error

于 2011-02-25T00:28:11.670 に答える