最近やっと自分のHaskellのコーディングスタイルが固まってきたので, 纏めておきたいと思います.
尚, 今回の記事は@YoshikuniJujoさんのこちらの記事
(Haskell - 個人的な(そして異端的な)コーディングスタイル)の構成とサンプルコードを借用させて頂いています.
@YoshikuniJujoさん, ありがとうございます.
はじめに
色々試行錯誤した結果, 美しさと読みやすさを最優先することにしました.
書く時, またそれの修正時には多少手間がかかりますが, Vim等のエディタの機能を最大限利用して効率化を図ろうという方針です.
GHCのPreludeのソースと@YoshikuniJujoさんのソースに多分に影響を受けているかと思います.
字下げ
半角スペースを使います. また, インデントの文字数は可変です.
関数の型宣言はの::
は=
と縦に揃え, =
の後ろのスペースは2つ分空けます.
hello :: String -> IO String
hello str = do print str
return str
以下のように, 改行前の文字に合わせます.
do
の直後は改行をしません.
スペース
スペースに関しては, @YoshikuniJujoさんのこちらの記事
(Haskell - 個人的な(そして異端的な)コーディングスタイル)と殆ど同じですが, 複数行にまたがる括弧のみ違います.
複数行にまたがる括弧では, 開き括弧とコンマが縦に並ぶように記述します.
list1 = [ item1
, item2
, item3
, item4 ]
レコード構文でderiving
がある場合は以下のようにします.
data Some = Some { slot1 = value1
, slot2 = value2
, slot3 = value3
} deriving (Show)
1行の幅
1行の幅は基本的に80文字までとします.
"どんな環境で見ても大体折り返し無く見れる"というのが個人的な理想なので, どんなに長くても100文字までには改行したいと思っています.
ただ, 字下げをスペース可変にしている関係で, 必然的に文字数が多くなる傾向にはあります.
演算子と改行
行内で改行が必要になった際は, 演算子が行頭に来るように改行しています(が, 可読性の向上のために行末に変更するかも知れません).
hello = "Hello, hello, hello, hello, hello, hello, ..., "
++ "world!"
foo = fun1
. fun2
. fun3
$ fun4 x
bar = monad1
>>= monad2
>>= monad3
>>= monad4
baz = fun
<$> app1
<*> app2
<*> app3
<*> app4
変数名
変数名はまだあまり綺麗に固まっていません.
スコープの狭い変数は, 3文字以下の略語(f, xs, ch, str等)を付けています.
演算子($)の連続
演算子($)が連続する場合は, 出来る限り全て演算子(.)に置換します.
f $ g $ h $ ... y $ z $ a
このような場合は, 以下のようにします.
(f . g . h . ... y . z) a
複数の関数をまとめて型宣言するとき
複数の関数の型宣言をまとめて行ったことはありません.
今後検討します.
where節
where節は以下のように記述します.
fun x = ...
where y = ...
z = ...
let-in式
基本的にlet-in
式は使わないようにしています.
なるべくwhere
を使います.
ワイルドカードを使う/使わない
ワイルドカードに関しては, @YoshikuniJujoさんのこちらの記事
(Haskell - 個人的な(そして異端的な)コーディングスタイル)と同じです.
モジュールの導入
モジュールの導入に関しては, @YoshikuniJujoさんのこちらの記事
(Haskell - 個人的な(そして異端的な)コーディングスタイル)と同じです.