LoginSignup
0
0

More than 5 years have passed since last update.

functionのインデント

Posted at

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#でも関数レベルで引数を分けているという気持ちでインデントが許されているのではないか、ということです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0