HaskellのABC(Haskell Advent Calendar 6th)

Haskellといえば一文字変数名、一文字変数名といえばHaskellという{{要出典}}ほどにHaskellでは一文字の変数名がよく使われている。これは名前を考えるのをサボっているとは限らない。多相性によって変数が具体的な性質を持たないがゆえに、具体的な名前がつけられないというのが主な理由だ。あるいは、適切な名前があっても、既存の名前と被っているという場合もある。かといって完全なランダムというわけでもないので、一文字変数名はどのように選べばいいか考察していこう。

a

よくある種: *

アルファベットの最初であるaは汎用性が高い。型変数に使うのが王道だ。値レベルの変数として単体で使うことは意外と少ない。

reverse :: [a] -> [a]

b

よくある種: *

aに続いて、bも型変数によく使われる。

map :: (a -> b) -> [a] -> [b]

c

三つの値が与えられたとき、それぞれa, b, cとつけることが多い。また、継続(continuation)に名前を付けたいがkcontが使用済みな場合にも使う。

d

よくある型 Float, Double

差分(difference)もしくは行列式(determinant)として。dx,dyのように他のアルファベットと組み合わせる場合も多い。

e

何かの要素(element)であるという性質を強調したいとき、型、値ともに使うことがある。

f

よくある種 * -> *

関数(function)を表すのに非常に重要だ。Alternative以下な関手のための型変数にもよく使われる。

g

よくある種 * -> *

fとほぼ同じ用途である。

h

fと同じ使い方もするが、高さ(height)としての出番が多い。

area :: Num a => Rectangle a -> a
area (Rectangle w h _ _) = w * h

i

よくある型 Int

添字(index)を表す定番の文字で、言語を問わずよく使われている。入力(input)を表すのにも使う。

j

よくある型 Int

iに続いて添字を表す。筆者はヤコビアンに使ったこともあるが、あまりいい例とは言えない。

forM_ [0..9] $ \i -> forM_ [0..9] $ \j -> putStrLn $ show i ++ " * " ++ show j ++ " = " ++ show (i * j :: Int)

k

第三の添字あるいはマップのキーのほか、Haskellにおいては継続の名前としてもよく使われる。種変数も忘れてはいけない。

answer :: ContT r IO Int
answer :: ContT $ \k -> do
   putStr "Calculating the answer..."
   k 42
   putStrLn "Done."

l

長さ(length)として。まれに、内容に興味のないリストの名前として使うこともある。

m

よくある種 * -> *

よくある型 Map k v, Int

モナドの型変数や、モナディックなアクションの名前として頻繁に使う、ある意味Haskellらしい変数名だ。nと共に、整数の変数としてもしばしば出番が来る他、マップの名前としても使う。

when :: Monad m => Bool -> m () -> m ()

n

よくある型 Int

自然数ないし整数を表すことが多い。モナドが二つあるときに使うことも稀にある(mmorphなど)

o

oは忌避される傾向があるが、原点、オプション、出力など、いくらか使い道はある。

p

よくある型 Double, a -> Bool

パラメータ、位置(position)、点(point)、述語(predicate)、ピボットなどに引っ張りだこだ。

q

pに続いてパラメータとして使われる。クエリにも。

r

よくある型 a -> r

結果または継続を表す。これを奪われると個人的にきつい。

newtype ContT r m a = ContT { runContT :: (a -> m r) -> m r }

s

よくある種 *

状態(state)、ストリーム、構造(structure)などに使う。個人的なお気に入りだ。

type Lens s t a b = forall f. Functor f => (a -> f b) -> s -> f t

t

よくある型 Float, Double

時間(time)、接点、接線(tangent)など。

u

よくある型 Float, Double

UV座標系を扱う際、vとの対で用いる。

v

よくある型 Float, Double

「値(value)」として漠然と使うこともあれば、ベクトル(vector)を表すこともある。言語処理系を実装する際は変数(variable)という意味でも用いる。

w

よくある型 Float, Double

幅(width)、重み(weight)、あるいはクオータニオンの成分など。モナドの双対であるコモナドの型変数としても使われる。その心は上下反転させたm。

x

よくある種 *

値の変数の定番中の定番だ。振る舞いに一切関与しない型変数にも用いられる。

y

xと同様、変数に使う。

z

x,yと同様、汎用的な変数名。座標を扱う際は頻繁に用いる。rが使えないときに代用することもできる。

総評

抽象度の高いコードにおいて、名前をつけるというのはなかなか難しい問題の一つだ。幸い、型変数含め局所的な変数なら一文字でも行儀は悪くないので、既存のライブラリなども参考にしつつガンガン短い名前を使っていこう。