このブログ記事では、Haskellの重要なデータ型であるEitherを紹介します。

Either
データ型がInt
かString
(他のデータ型のペアも同様)かどちらかであるというデータ型があると便利な場合が多々あります。
そんな時便利なのがEither
というデータ型です。
data Either a b = Left a | Right b
Either
型を使えば以下のようなこともできます。
data Either a b = Left a | Right b
type someData = Either Int String
[Left 1, Right "Hello"] :: [someData]
事前定義された関数
Either
は非常に便利なデータ型であるため、HaskellにはEither
に関するいくつかの事前定義された関数があります。
import Data.Either
-- Leftを抽出
lefts :: [Either a b] -> [a]
-- Rightを抽出
rights :: [Either a b] -> [b]
-- EitherがLeftかどうかを返す
isLeft :: Either a b -> Bool
-- EitherがRightかどうかを返す
isRight :: Either a b -> Bool
上記の関数は簡単ですが、Either
にはさらに興味深い関数が2つあります。それはeither
とpartitionEither
です。
-- Eitherのデータ型に応じた関数を適用する
either :: (a -> c) -> (b -> c) -> Either a b -> c
-- LeftとRightの値をリストのタプルに分割する
partitionEither :: [Either a b] -> ([a], [b])
either
を使用すると、以下のようなことができます。
f = either (\l -> "Err: Number is provided.") (\r -> "Hello, "+r+"!") -- partial function application
上記の例は、Either
がMaybe
のようにエラーハンドリングに使用できることを示唆しています。違いはNothing
が値を保持しないのに対し、
Leftは内部の値を保持できる点です。これにより、エラーの詳細を表示したい場合にはEither
が好まれます。次の記事では、Either
が例外を投げる際に
どのように役立つかを見ていきます。
クイズ
この記事では、学習した内容を確認するためのクイズを設けます。記事のメイン部分を読んだ後に、ぜひ自分で問題を解いてみることを強くお勧めします。各問題をクリックすると答えが表示されます。
リソース
- Philipp, Hagenlocher. 2020. Haskell for Imperative Programmers #22 - Either. YouTube.