Haskellerへの道 #18 - Either

Last Edited: 7/15/2024

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

Haskell & Either

Either

データ型がIntString(他のデータ型のペアも同様)かどちらかであるというデータ型があると便利な場合が多々あります。 そんな時便利なのが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つあります。それはeitherpartitionEitherです。

-- 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

上記の例は、EitherMaybeのようにエラーハンドリングに使用できることを示唆しています。違いはNothingが値を保持しないのに対し、 Leftは内部の値を保持できる点です。これにより、エラーの詳細を表示したい場合にはEitherが好まれます。次の記事では、Eitherが例外を投げる際に どのように役立つかを見ていきます。

クイズ

この記事では、学習した内容を確認するためのクイズを設けます。記事のメイン部分を読んだ後に、ぜひ自分で問題を解いてみることを強くお勧めします。各問題をクリックすると答えが表示されます。

リソース