Stupid Haskell Code
プログラミングでは、KISS(Keep It Simple Stupid) Principleってよく言うけど、JavaとかではSimpleを追求すればほぼStupidになるんで、最後のStupidの意味がいまいちつかみにくいかもしれない。
しかし、Haskellのようにいろいろ高度にかけちゃう言語で物事の説明をする場合、このStupidが結構重要だったりする。単にSimpleに書くとStupidじゃなくなるから。
一応、自分のStupid指針はJavaのような「普及言語との距離をむやみに離さないこと」。で、この基準を維持していれば、Haskellは以外と普通の言語っぽくなり、説明しやすい。haskellっぽさは薄まるけど。
- なるべく$は使わない
func a $ b $ c d → func a (b (c d))
- なるべく関数パターンはdata型一つだけに使う
data Animal = Cat | Dog | Rabbit hello Cat name = "nyao " ++ name hello Dog name = "wanwan " ++ name hello Rabit name = "musyamusya " ++ name
- なるべく抽象的名称は使わない
- 高階関数の利用や定義で使う識別子名には特に注意する(fやnなんかは×)
- カリー化された関数定義(?)は使わない
- こういうこと
plusOne = (+) 1 → plusOne n = n + 1 square = ^ 2 → square n = n ^ 2
-
- 関数と他の値との区別はつけておく
- 本当に関数を返す場合は、type宣言してそれを使う
- .やMonadで>>=や>>は使わない
- 理由はカリー化と同じ
- Monad型の利用ではdoを入れる
func :: Int -> IO [String] func n = getArgs ↓ func n = do args <- getArgs return args
-
- むしろ積極的にMonad型/doは使う
- 複雑な関数をとるfoldl/foldrやmapはつかわない
- foldの中で直接foldとか使うとアウト
- インデント数は識別子の長さに依存させない
- インデントレベルが意味を持つ以上、スペース数が関数によって違うようにはさせない
ほかにもあるけど、とりあえずこのくらい。これくらいやるだけでも、さすがにRubyとまではいかないけど、構文がきれいなぶんだけ、Schemeよりは受け入れやすいんじゃないのかなあ。