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よりは受け入れやすいんじゃないのかなあ。