正しくTogetter / min.tにログインできない不具合が発生中です。X側の修正をお待ちください(詳細はこちら)

C#で学ぶF#入門・再(2)

「C#で学ぶF#入門・再(2)」関連のつぶやきです。
3
前へ 1 2 ・・ 5 次へ
あえとす @aetos382

F# はインデントでスコープを表現するよ。 #cs2fs

2013-04-10 21:33:47
あえとす @aetos382

複数の引数を取る関数を、1つの引数を取る関数の組み合わせに変換することを「カリー化」という。カリー化された関数に一部の引数だけ与えることを「部分適用」という。カリー化と部分適用の混同に注意。 #cs2fs

2013-04-10 21:41:35
あえとす @aetos382

カリー化しない関数も書ける。let f (x, y) = x + y;; これは (x, y) という1個のタプルを取る関数になる。 #cs2fs

2013-04-10 21:44:36
あえとす @aetos382

if 文全体が値を持つので、値を返す場合は else が必須。if ブロックの中が unit であれば else は要らない。 #cs2fs

2013-04-10 21:50:15
あえとす @aetos382

F# では配列アクセスにドットが要る。 x.[1] #cs2fs

2013-04-10 21:51:49
あえとす @aetos382

配列の定義は let a = [| 1;2;3 |];; 縦棒なしで let b = [ 1;2;3 ];; とするとリスト型になる。 #cs2fs

2013-04-10 21:53:57
あえとす @aetos382

F# には while や for のようなループ構文もあるが、break / continue はない。ループはなるべく再帰関数で書きます。 #cs2fs

2013-04-10 21:55:11
いげ太 @igeta

@aetos382 C# でなるべく Linq を使うのと同じように、F# でも Array/List/Seq の関数をまず検討して、どうしても無理って場合だけ再帰を使います。

2013-04-10 21:58:06
あえとす @aetos382

let r = ref a;; で参照。参照はがしは !r 。参照への代入は r := 2 でできるけど、オリジナルの a の値は変わってない。その場で即時別のインスタンスが作られて参照先を変えている感じ。 #cs2fs

2013-04-10 22:04:38
あえとす @aetos382

関数外の変数にアクセスする関数をクロージャという。クロージャは宣言した時点で外の変数を部分適用したように振る舞うので、外の変数を mutable にすることはできない。 #cs2fs

2013-04-10 22:08:14
いげ太 @igeta

@aetos382 C# でも同じ話題はありますが、クロージャが外の変数を取り込むことを、変数キャプチャと呼びます。

2013-04-10 22:13:30
あえとす @aetos382

ref なら mutable みたいなことができるのでクロージャの中でも使える。 #cs2fs

2013-04-10 22:11:27
いげ太 @igeta

@aetos382 クロージャは値のみキャプチャができる。んで、ref は参照の値渡しになるけど、mutable だと参照そのものを渡そうとするのでダメ、みたいな感じ。

2013-04-10 22:15:34
あえとす @aetos382

クラスの定義は type を使う。プライベートメンバー変数は let、public メソッドは member キーワードで宣言。val っていうキーワードもあるらしい。 #cs2fs

2013-04-10 22:19:48
七誌 @7shi

C#のフィールドをラムダ式で初期化できないと思いこんでいた。できると指摘されて確認したらできた。何でそう思っていたんだろう・・・

2013-04-11 01:40:00

引数の書式

あえとす @aetos382

引数が1つならカッコは要らない #cs2fs

2013-04-10 20:14:24
あえとす @aetos382

printf / printfn のような組み込み関数ではカッコはつけない。.NET のメソッドの場合は要る。 #cs2fs PowerShell に似てるね。

2013-04-10 20:15:12
あえとす @aetos382

F# 組み込み関数では引数にカッコはつけないで、引数は空白で区切る。.NET のメソッドは C# と同じで、カッコつけてカンマ区切り。ただし引数が1つの時はカッコ省略可能。 #cs2fs

2013-04-10 20:17:23
はぇ~ @haxe

@aetos382 メソッドの引数はTuppleで指定するからかっこが必要~

2013-04-10 20:31:17
あえとす @aetos382

引数を取らない関数は let f () = 1;; のように書く。呼び出すときは f () #cs2fs

2013-04-10 20:51:28
あえとす @aetos382

引数を取らない関数の宣言をするときに、関数名と () の間にスペースを開けるかどうかは微妙やね。

2013-04-10 22:27:16
いげ太 @igeta

@aetos382 空けるのが通例かと。開けなくてよいのは () が記号だからパース時にうまいこと区切られるからで、感覚としては、3 + 4 を 3+4 と書いてもよい、というのに似てるですね。

2013-04-10 23:09:24
あえとす @aetos382

@igeta ただ、unit がキーワードでなく () という表記なので、C 風の関数っぽく 見えないこともないので。C なら一般に関数名と () の間は空けませんから。それを意図したかどうかは分かりませんが。

2013-04-10 23:59:00
前へ 1 2 ・・ 5 次へ