複数の引数を取る関数を、1つの引数を取る関数の組み合わせに変換することを「カリー化」という。カリー化された関数に一部の引数だけ与えることを「部分適用」という。カリー化と部分適用の混同に注意。 #cs2fs
2013-04-10 21:41:35カリー化しない関数も書ける。let f (x, y) = x + y;; これは (x, y) という1個のタプルを取る関数になる。 #cs2fs
2013-04-10 21:44:36if 文全体が値を持つので、値を返す場合は else が必須。if ブロックの中が unit であれば else は要らない。 #cs2fs
2013-04-10 21:50:15配列の定義は let a = [| 1;2;3 |];; 縦棒なしで let b = [ 1;2;3 ];; とするとリスト型になる。 #cs2fs
2013-04-10 21:53:57F# には while や for のようなループ構文もあるが、break / continue はない。ループはなるべく再帰関数で書きます。 #cs2fs
2013-04-10 21:55:11@aetos382 C# でなるべく Linq を使うのと同じように、F# でも Array/List/Seq の関数をまず検討して、どうしても無理って場合だけ再帰を使います。
2013-04-10 21:58:06let r = ref a;; で参照。参照はがしは !r 。参照への代入は r := 2 でできるけど、オリジナルの a の値は変わってない。その場で即時別のインスタンスが作られて参照先を変えている感じ。 #cs2fs
2013-04-10 22:04:38関数外の変数にアクセスする関数をクロージャという。クロージャは宣言した時点で外の変数を部分適用したように振る舞うので、外の変数を mutable にすることはできない。 #cs2fs
2013-04-10 22:08:14@aetos382 クロージャは値のみキャプチャができる。んで、ref は参照の値渡しになるけど、mutable だと参照そのものを渡そうとするのでダメ、みたいな感じ。
2013-04-10 22:15:34クラスの定義は type を使う。プライベートメンバー変数は let、public メソッドは member キーワードで宣言。val っていうキーワードもあるらしい。 #cs2fs
2013-04-10 22:19:48引数の書式
printf / printfn のような組み込み関数ではカッコはつけない。.NET のメソッドの場合は要る。 #cs2fs PowerShell に似てるね。
2013-04-10 20:15:12F# 組み込み関数では引数にカッコはつけないで、引数は空白で区切る。.NET のメソッドは C# と同じで、カッコつけてカンマ区切り。ただし引数が1つの時はカッコ省略可能。 #cs2fs
2013-04-10 20:17:23@aetos382 空けるのが通例かと。開けなくてよいのは () が記号だからパース時にうまいこと区切られるからで、感覚としては、3 + 4 を 3+4 と書いてもよい、というのに似てるですね。
2013-04-10 23:09:24@igeta ただ、unit がキーワードでなく () という表記なので、C 風の関数っぽく 見えないこともないので。C なら一般に関数名と () の間は空けませんから。それを意図したかどうかは分かりませんが。
2013-04-10 23:59:00