F#

functionのインデント

More than 1 year has passed since last update.

F#では関数を引数レベルでパターンマッチする function というキーワードがあります。このインデントについて気付いたことのメモです。

functionmatch のポイントフリースタイル版のような印象を持っていました。

F#
let foo1 = function
| 0 -> "!"
| _ -> "?"

let foo2 x = match x with
             | 0 -> "!"
             | _ -> "?"

printfn "%A" (foo1 0, foo2 0)
printfn "%A" (foo1 1, foo2 1)
実行結果
("!", "!")
("?", "?")

しかし引数を暗黙化するだけでなく、インデントも異なります。functionlet と同じレベルで書くことが許されますが、match= の右辺として扱われます。

これがどういう気持ちなのかずっと分からなかったのですが、Haskellのパターンマッチと似た気持ちなのではないかと気付きました。

Haskell
foo1 0 = "!"
foo1 _ = "?"

foo2 x = case x of
         0 -> "!"
         _ -> "?"

main = do
    print (foo1 0, foo2 0)
    print (foo1 1, foo2 1)
実行結果
("!","!")
("?","?")

Haskellでは形式的に関数自体を複数書くようなスタイルで引数をパターンマッチしますが、これと同じようにF#でも関数レベルで引数を分けているという気持ちでインデントが許されているのではないか、ということです。