【.NET】F#について語れ2【OCAML】

■ このスレッドは過去ログ倉庫に格納されています
2011/05/01(日) 02:46:49.52
MSResearchから出てきた.NETで使える関数型言語のひとつF#
OCAMLの流れを汲むこの言語、いろいろと面白そうなことができそう。
そろそろ日本語の情報が充実してきそうなこの言語について、幅広く語れ。

http://www.fsharp.net/

前スレ
【.NET】F#について語れ【OCAML】
http://hibari.2ch.net/test/read.cgi/tech/1186030985/

関連スレなどは >>2-
2011/06/01(水) 00:26:26.68
>>61
F#のクラス定義の方法は
難解で読みにくいってのはまあ慣れと好みだが
冗長でってのはどうかね?

C#のクラス定義は単純明快ってのは
私はC#のクラス定義に慣れているんです
って以外に意味を持たない主張に思えるが。
63デフォルトの名無しさん
垢版 |
2011/06/01(水) 01:15:18.81
>>62
memberは明らかにいらない子
2011/06/01(水) 07:35:25.35
memberがいらないとか・・・
全然明らかじゃないからkwsk
2011/06/01(水) 09:04:05.36
F#ではfun x y ->x+yをx y->x+yに出来なかった言語仕様上の問題とかあったん?
2011/06/01(水) 09:32:09.49
>>64
クラスを定義してるのが明らかなのだから、
memberという修飾子はいらない。
あと、そもそもletが冗長なのと
副作用がないならnewを省略したい。

下記のようなシンプルさが欲しい。
class A(a:float)
add b = A(a + b)
minus b = A(a - b)
inc = add 1
dinc = this.inc.inc

この場合、IDE側でクラス名と関数名に色をつけてくれないと
クソ読みにくい。オフサイドルールの欠点。

あとandもクソ仕様。
2011/06/01(水) 18:11:51.65
funは正直鬱陶しいなあ。
68デフォルトの名無しさん
垢版 |
2011/06/01(水) 18:40:51.63
F#やってて、便利と思うのは
関数の中に関数をかけることだな。
しかも、F#における関数はOOPでいう関数ではなく、
OOPのクラスに相当する。

逆に不便だなって思うことは、共通して使う関数を作った時に
どこへ置けばいいかわからないこと。F#はスコープの制御がダメだね。
2011/06/01(水) 20:34:34.08
>>65
OCaml互換。C#の人かな。\x ->ならまだしもx ->はさすがに無理くねーか。
>>67
気持ちはわかります。

>>66
クラス内にはletとdoもかけるぞ。あとコンストラクタはメンバじゃねえ。

>>68
どこ置けばいいかわからない?F#でだけ?どの言語でも同じじゃまいか。
2011/06/01(水) 20:37:59.90
あと自動整形できないからっての、よくわからん。
整形されたコードしかコンパイル通らんのだから
そもそも整形する必要ないじゃんか。



まあ俺もオフサイドルール嫌いだけど。
2011/06/02(木) 12:42:05.73
オフサイドルールをやめるとすると、
他の選択肢ってなんだろ?
一つは{}だよね。
2011/06/02(木) 15:49:55.04
あれーC#から使う時に、F#のunionの各サブクラスへの変換とかなんかメソッドなかったっけ
FSharpUnion<Employee>.get_Manager的な。
isManagerでしてから普通にキャストすればよかったんだっけ?
2011/06/02(木) 16:13:53.96
>>71
つ Verbose syntax
2011/06/02(木) 20:42:24.42
FSIにnamespaceとかopenて流し込めないんだね・・・

デバッグの途中で
add 1 2
とか打てたらいいんだけど・・・
F#ってデバッグが難しいね;;

2011/06/02(木) 21:59:27.33
>>72
サブクラスとか、キャストとか、なんか根本的に間違ってないか。

>>74
openは流せる。まさかopen Listがエラーだからとか言わないよね?
76デフォルトの名無しさん
垢版 |
2011/06/02(木) 22:05:03.83
>>75
あぁ、ごめん。書き方が悪かった。

自分で定義したnamespaceを
openすることができないってことでした。すいません。
2011/06/02(木) 22:44:29.66
>75
いやC#からだとUnionそういう風にしか扱えなくなかったっけ?
そのUnionのインスタンスでIsManagerとかよべるけど。ManagerであるUnion値をManagerとして扱いたいときにどうしたらいいかって話。
もっとまともな方法あったっけ?
2011/06/03(金) 00:30:20.24
>>77
type Employee = ... | Manager of Hoge の場合↓

var emp = Employee.NewManager(hoge);

if (emp.IsManager) {
    var mngr = ((Employee.Manager)emp).Item;
    // dosomething
}

だからDesign Guidelinesにはまんま使うなと書いてある。
2011/06/03(金) 09:26:19.89
誰かF#のいいデバッグ方法教えてー
2011/06/03(金) 09:28:24.98
F#のC#に対して優れているところを教えてください
2011/06/03(金) 09:50:11.17
>>80
協力な型推論、nullがない、パターンマッチ、関数内関数ができる、対話環境、並列計算に強い
とかじゃね。
2011/06/03(金) 09:55:29.01
nullって悪者なんですか・・・
パターンマッチ、並列計算に強い はおもしろそう
2011/06/03(金) 10:13:46.63
>78
あーやっぱりそんな感じかー
>79
自分も最初は悩んでたけど、最近はなんも困ってないな。なんでだろ。途中でうまく止めて値見るのとWriteLineで出しとくのとヘルパーとか使ってFSharpFunc楽に実行できるようにしたところか?
そもそもDebugが必要になる羽目になることが少なくなったというのもある気がするが。
>80
Debugしながらでもソースがいじれるところ。
2011/06/03(金) 10:16:25.55
>>83
Debugしながらでもソースがいじれる・・・イイ!
2011/06/03(金) 11:02:45.96
>>82
実行時エラーがない方が運用上大いなるなメリットがあるのは当然だろJK
quick sortの発明者アントニーホーアはnullは10億ドルの過ちであると言っている。
ttp://news.livedoor.com/article/detail/4047613/
2011/06/03(金) 15:53:21.29
まあ、どんなの場面でもnull不要とはいわないけども、
Anders Hejlsbergも「nullableの概念は参照型/値型の概念とは独立させておくべきだった」っていってるしね。
非nullable参照型は欲しい。
2011/06/03(金) 18:18:05.09
>>86
関数型言語にはnullは必要ないよ。関数型プログラマはnull参照エラーみたいなアホみたいな実行時エラーとは
無縁の世界でプログラムしているよ。
88デフォルトの名無しさん
垢版 |
2011/06/05(日) 00:00:41.87
>>83
FSharpFuncってなんですか?

数値計算のプログラムを作ってる時は、
デバッグは絶対必要なんですよね・・・

関数の形で定義してると、途中で止めても
中の数値が見れないんですよねorz

let x=f a
とかしちゃってる時に、
f 1
の値を見る方法がないと、数値計算のプログラムのデバッグは
無理かなーと。

現状のF#を数値計算に使うと死ぬかも・・・・
2011/06/05(日) 06:40:44.23
伝統のprintfデバッグじゃダメ?
let dbg x = printfn "*debug:%A" x; x;;

こんな感じで使う。
[1..10] |> List.map ((+) 1) |> dbg |> List.map(fun x -> dbg(float x / 2.0));;

90デフォルトの名無しさん
垢版 |
2011/06/05(日) 12:12:50.78
>>89
%Aでリスト(行列)を全表示できるのかな?
そうなら、そういう関数作っておけば、確かに楽そうだね。
DOS窓かよって不満はあるけどw
それやってみるよ。ありがと。

また、ただ、いろいろ細かい状態が知りたかったりするから
デバッグ中に値が知りたいというニーズは多いし、
あとはけっこう量が多いんだよね・・・うーん。
2011/06/05(日) 12:13:56.07
そういえばVSのデバッガは何だかんだでC#前提なままだったね。
2011/06/05(日) 12:25:05.75
> FSharpFuncってなんですか?
関数の型。クロージャ作るとそゆ型が付く。
まーF#の中にいる限りは特に意識する必要ないが。
C#と連携したいなら覚えておくといいかも。
93デフォルトの名無しさん
垢版 |
2011/06/07(火) 12:29:28.85
F#のイディオム的なテクニックを教えてほしいな。
例えば、クロージャーとか簡単なもの。

使い始めたんだけど、上手く使えてるか自信がない。
F#ならではの書き方あったら教えてください。
2011/06/07(火) 18:32:10.90
>>93
LINQは使ったことありますか?
2011/06/07(火) 20:10:49.92
>>94
C#では使ったことがあります。
2011/06/07(火) 23:39:58.82
>>93
関数型の場合何やるにも再帰。
とくに末尾再帰はしっかりみにつけるべき。
2011/06/08(水) 10:21:18.89
>>93
非関数型プログラマ: forやwhileループを使う
関数型入門者: 再起を使う
中級者: map, foldをなるべく使う

これが割と参考になるかも。
2011/06/08(水) 10:27:21.76
>>97
上級者は何を使うんだ?
2011/06/08(水) 10:47:37.21
文字列のlistがあって、その文字列を表示できる矩形を重ならないように上から並べたrectと文字列のタプルのリスト返せっつったら、foldで次のトップと結果のlistを状態にするような感じでよろし?
こういうのにfold使うのなんか微妙に違和感あるんだけれどこんなもんかね@関数型初心者。
2011/06/08(水) 11:11:11.30
>>99 こんな感じ?
let union rect1 rect2 = new Rect(rect1.x, rect1.y, max rect1.width rect2.width, rect1.height+rect2.height) in
ss
|> map (fun s -> getRectOf(s))
|> fold union empty_rect
2011/06/08(水) 21:30:46.81
F#って末尾最適化はやってくれている?
2011/06/08(水) 22:13:07.22
コンパイル時に .tail がつく
2011/06/08(水) 22:28:05.14
F#で文字の連結ってどうするんですか?
+でできるのはわかるんですが、これだと遅いですよね?
2011/06/08(水) 22:50:12.35
いっておくがStringBufferみたいなものはないからな
2011/06/08(水) 22:51:05.82
StringBuilder使えって言っておけばいいのかな
2011/06/08(水) 23:17:37.07
末尾最適化になってるはずなんだがstackOverFlowになるってことはなってないんだろうなぁ・・・何か確認する方法あったっけ。
そもそも要素一つずつ減らしてるから無限ループになるはずないのに4千件ぐらいでStackOverFlowになるってなんか変だ。
Console.WriteLineで出力しても途中まで減ってってるのに突然何も出さなくなって5秒ぐらいしてからStackOverFlowが出てもうわけわかめ(´;ω;`)ブワッ
2011/06/09(木) 05:16:59.39
>>106
コードkwsk
2011/06/09(木) 05:19:42.26
.tailプリフィックス付いてても状況によっては無視されるって奴かな?
109106
垢版 |
2011/06/09(木) 08:39:36.40
あれーインタラクティブに流し込んだらもっとたくさん流し込んでもさっくり動くよ…
そもそもデバッガーだと末尾最適化しないとかあったっけ?いやそんなことないよね…

問題だけどインタラクティブでさっくり動いたコードとりあえずまるっと載せてみる

let inRange from t v=from<=v&&v<=t

//rangeによってポイントをまとめる。
//現在のrange=from〜tに合うならptListに追加。
//合わないなら今までのptListを一組としてptListListに追加し、新しいポイントとしてptListに追加。
//合うrangeがなくなるか、iListが空になったら抜ける。
let rec toPtrListList (ptList,ptListList,((from,t)::rangeList)) (i::iList) indToInter indToVal=
// Console.WriteLine("toPtrLL----{0}",System.Environment.TickCount)
// Console.WriteLine ("toPtrLL iList={0},rangeL={1}",List.length iList,rangeList.Length)
let inter=indToInter i
let toPt()=inter,indToVal i
//System.Drawing.PointF(float32<|trans.XInterToUI inter,toUIY series.[i]|>float32)
//helper-----
//合うrangeを探してそれ以降を返す。
let rec findFitRange rangeList inter=
// Console.WriteLine("findFitR {0}",System.Environment.TickCount)
match rangeList with
|[]->None
|(from,t)::tail->
if inRange from t inter then Some rangeList
else findFitRange tail inter
//iListが空ならその時点のを結果とする。有るなら続き。
110106
垢版 |
2011/06/09(木) 08:40:17.92
//続き
let contOrBreak (ptList,ptListList,rangeList) iList=
// Console.WriteLine ("contOrBreak iList={0}",List.length iList)
match iList with
|[]->[],ptList::ptListList,rangeList
|_->toPtrListList (ptList,ptListList,rangeList) iList indToInter indToVal
// Console.WriteLine("toPtrLL---before helper {0}",System.Environment.TickCount)
//-----helper
if inRange from t inter then
//現在のrangeに合う。
contOrBreak (toPt()::ptList,ptListList,((from,t)::rangeList)) iList
else
//rangeに合わない
if t<inter then
//現在のrangeよりinterが先。
match findFitRange rangeList inter with
|Some (rangeList)->
//fitするものがあったのですすめる。
contOrBreak ([toPt()],ptList::ptListList,rangeList) iList
//なかったので現在のものを結果とする。
|_->[0,0],ptList::ptListList,(from,t)::rangeList
//inter<fromなので今のindを捨てる。
else
// Console.WriteLine ("hogehoge iList={0}",iList.Length)
contOrBreak (ptList,ptListList,((from,t)::rangeList)) iList

let test=
toPtrListList ([],[],[0,10000;10001,20000;20001,30000]) ([0..50000]@[0..100]) id (fun i->i+100000)

111106
垢版 |
2011/06/09(木) 08:43:47.05
インデントが(;´Д`)

let inRange from t v=from<=v&&v<=t

//rangeによってポイントをまとめる。
//現在のrange=from〜tに合うならptListに追加。
//合わないなら今までのptListを一組としてptListListに追加し、新しいポイントとしてptListに追加。
//合うrangeがなくなるか、iListが空になったら抜ける。
let rec toPtrListList (ptList,ptListList,((from,t)::rangeList)) (i::iList) indToInter indToVal=
// Console.WriteLine("toPtrLL----{0}",System.Environment.TickCount)
// Console.WriteLine ("toPtrLL iList={0},rangeL={1}",List.length iList,rangeList.Length)
let inter=indToInter i
let toPt()=inter,indToVal i
//System.Drawing.PointF(float32<|trans.XInterToUI inter,toUIY series.[i]|>float32)
//helper-----
//合うrangeを探してそれ以降を返す。
let rec findFitRange rangeList inter=
// Console.WriteLine("findFitR {0}",System.Environment.TickCount)
match rangeList with
|[]->None
|(from,t)::tail->
if inRange from t inter then Some rangeList
else findFitRange tail inter
//iListが空ならその時点のを結果とする。有るなら続き。
112106
垢版 |
2011/06/09(木) 08:44:27.70
スペースを入れてもダメか。俺\(^o^)/オワタ
2011/06/09(木) 09:16:04.56
htmlレンダリングの問題だけで、スレに書き込まれてるソース的には空白やタブ残ってたと思った。

リンク貼る形式なら、gistや>11の使うといいと思う
2011/06/09(木) 09:46:14.43
>>113
106ではないが、インデントを推測して貼ってみた。F#の構文がわからないので間違ってるかも
ttp://ideone.com/JW8dl
2011/06/09(木) 10:06:12.85
>>106
よくわからんがfindFitRangeは再帰しなくても高階関数使った方がシンプル
let inRange v (from, t) = from<=v&&v<=t
let isFit v ranges = ranges.exists(isRange v)
let findFitRange ranges inter =
if (isFit inter ranges) then Some ranges
else None
2011/06/09(木) 10:51:09.46
>>113の通りで、データとしては空白残ってるよ
俺はnavi2ch使ってるので普通にインデントが見れる
http://ideone.com/eE0C0
117106
垢版 |
2011/06/09(木) 11:37:16.53
>113-116
オマイラあり\(^o^)/

>115
いや、リストをなめていって見つかったらそれと、それ以降のやつをタプルで返してるのでそのやり方だとミリ。
なんかうまい高階関数あるのかもしれんが。
2011/06/09(木) 11:51:17.37
>>117
List.partition : ('T -> bool) -> 'T list -> 'T list * 'T list
ttp://msdn.microsoft.com/ja-jp/library/ee353782.aspx
が近いけどちょっと違うか。
こういう場合は素直に再帰をした方がいいのかな?
2011/06/09(木) 12:06:19.24
>118
それ条件で振り分けるやつだからちょと違うと思われ

というか自己解決したかも。
プロジェクトの設定でビルドタブに"tail呼び出しの生成"って項目あってそれオンにしたらサックリ動いた。
ってもこれ付けたらデバッグとかしにくくなんのかな。
お騒がせしますた。
2011/06/09(木) 12:12:10.32
※補足:
上の何も出さなくなって5秒ぐらいしてからStackOverFlowってのは例外になったのでVisualStudioが表示用とかに色々頑張ってる状態なんだろうね。
2011/06/09(木) 12:34:18.75
末尾呼び出しを最適化すると、関数のトレースが出来なくなる。
だから、デバッグするときは、最適化切ったりするね。
2011/06/11(土) 08:45:12.01
末尾最適化=スタックに積まないだからそりゃね。
でも再帰呼び出し時のスタック トレースが必要なことってある?
printf デバッグでいいんじゃねぇかと思うんだけど。
2011/06/11(土) 09:35:34.36
まぁそれいっちゃうとなんでもprintfデバッグで良くね?ってなるだろw
2011/06/11(土) 14:00:10.41
いやいやwスタックトレースは必要だと思ってるよw
どこからどう呼び出されてきた関数かはデバッグに不可欠
だけど、再帰の分に関しては必要ないんじゃね?って。
2011/06/11(土) 14:19:14.54
んーまぁ再帰でもなんでその条件分岐になったのか流れ見たいときはある希ガスんなぁ
printfでもいいけど。printfでいいか。
2011/06/11(土) 22:52:39.73
俺が想定してたのは再帰するしないで2分岐するだけの単純な再帰なんだけど
もしかするともっと複雑な再帰とかだとスタック見たいこともあるかも。
というかまあ見れる見れないだったら見れる方がありがたいのは確か。

ただ、再帰って、割とこうガチガチにロジカルに組まないとコンパイル通らない
ような気がしてて、スタック追っかけてまでデバッグする必要性あるかなあと
思ったりしたんだわ。
2011/06/15(水) 09:53:18.75
FSUnitとVisualStudioのテストおのおのどんなメリット・デメリットあるのかすら。
C#使ってた時はVSのつと使ってたけどF#だと使いにくい?
2011/06/15(水) 22:17:38.41
>>127
日本語?
母国語で頼む
2011/06/15(水) 22:59:09.06
母国語だとさらにわからないのでは?
2011/06/15(水) 23:15:40.40
中国語と韓国語なら読めるぜ
2011/06/16(木) 12:49:59.57
Alt+EnterでInteractiveに流し込もうとするとエラー音してできない時があるんだけど、そういう現象出てる人います?
ウィンドウ→新規で別ウィンドウ出すとそのソースからでもできるんだけどいまいち発生する条件がわからん。
2011/06/16(木) 18:49:46.13
結局TypeProviderってちょっとMeta情報与えてやることでF#でいろいろな情報がナイスに楽に使えるようになるってことでいいですか?(´・ω・`)
http://research.microsoft.com/apps/video/dl.aspx?id=150053&l=i
2011/06/18(土) 10:35:56.55
オブジェクトのXML相互変換、こんな感じに書けたよ( ・∀・)ノ
F#いいね。

http://ideone.com/IokO4
2011/06/24(金) 12:20:41.31
(・∀・)

Barrier使うぞ
http://blogs.msdn.com/b/mcsuksoldev/archive/2011/06/15/f-array-parallel-sort-functions-demonstrating-a-merge-sort-using-barrier.aspx

最近MCS UKの記事が多くなったけど、
MSR UK?から、だれか移ったのかな?
2011/06/27(月) 02:39:51.37
関数内で途中でreturn みたいに値を返したり
for内でbreakしたりしたいんですがどうやればよいですか?
136デフォルトの名無しさん
垢版 |
2011/06/29(水) 11:16:04.97
>>135
自分の場合はtryFindかtryPickかな。
どうしても途中で抜けたいなら、例外出して抜けるしかない。

自分もC++のコードをF#にしてみようと思ったときそこで悩みました。
結局、F#の繰り返しのfor文は全然使わないでList.mapかList.iterで処理するのがいいと思った。
137デフォルトの名無しさん
垢版 |
2011/07/01(金) 11:25:54.20
>>135
>関数内で途中でreturn みたいに値を返したり
条件で返す値を変える

>for内でbreakしたりしたいんですがどうやればよいですか?
手続き型のfor/whileは全て再帰だと思っていい
2011/07/02(土) 00:42:03.47
そこで継続ですよ。
139135
垢版 |
2011/07/02(土) 01:56:39.99
>>136-138

レスありがとうございます.
let loopですっきりとした記述ができました.
2011/07/05(火) 06:48:35.87
2011年、Ruby,Perl,PHP,Pythonって並べたときにさ
ここで、Ruby以外を選ぶ奴ってマジでなんなんだろうな


ゴミだし
2011/07/05(火) 13:47:18.60
これ ; デリミタっていうんだけどさ、これをつけなきゃエラーになるような
そんな言語使ってる奴ってどうみてもゴミだと思うんだけど

もしかして「;」これ打ち忘れてコンパイルエラー出すのが楽しいの?
そうか、二度と話かけんなよ


ゴミの分際でw
2011/07/10(日) 11:33:45.10
つ #light
2011/07/12(火) 18:22:39.87
コード見てないが、意外とF#遅くてがっかし(´・ω・`)
http://users.softlab.ece.ntua.gr/~ttsiod/score4.html
2011/07/17(日) 00:05:23.57
誰かseqのBuilderを実装しているソースどれかわかる人います?
2.0のソースはあるんだけど検索してもわからんです…
2011/07/17(日) 10:04:55.63
>>143
コード見ようや・・・
http://d.hatena.ne.jp/einblicker/20110712/1310476340
2011/08/07(日) 02:29:54.25
TIOBE TOP20入りしてた
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
msdnでドキュメント公開してるのも大きいんだろうな
2011/08/20(土) 02:34:49.66
F#って何がいいの?
って言う人には
http://www.slideshare.net/bleistift/cvbf
これを見るといいかもね?
2011/08/20(土) 02:38:41.36
あとこの辺も見ておくと
勉強になるかもね?
http://d.hatena.ne.jp/bleis-tift/20110803/1312345593
2011/08/20(土) 06:04:16.54
>>147 >>148
なってないなぁ…と思う。
そんなもん見るよりも、ちゃんと時間取って実践F#読む方がずっといいよ。
2011/08/20(土) 10:46:16.38
>>149
なってないなぁ…と思う。
そんなもん見るよりも、ちゃんと時間取ってExpert F# 2.0読む方がずっといいよ。
2011/08/20(土) 11:46:15.04
Real-World Functional Programmingも宜しくね
2011/08/20(土) 21:29:33.05
ちなみに何がなってないの?
153149
垢版 |
2011/08/21(日) 08:02:31.09
>>152
突っ込むために見直してみたら、そんなに突っ込み所は無かったかも。
>>149で頭ごなしに否定するのはまずかった。反省してる。

初見ではもっと気になる所があった気がしたけど、今見て思うのは以下。

・P35-P43 if式を(.NET中では)F#に特徴的、みたく書いてるけど、実はVB.NETにもif式はあるのです…
・P85 高性能、ではなくて、高機能、では?
・タプルを使ったPythonでいうアンパック代入相当の構文を備えていて、
 多値関数の戻り値が(x,y) = funcHoge(a,b)みたいに自然に書ける説明が抜けてる。
・リスト操作用の組み込み高階関数の説明が無い。

とか。重箱の隅かもしれんけど、気になるんよ。
154関数型入門中
垢版 |
2011/08/21(日) 19:29:53.73
質問させてください。

ここ数ヶ月、関数型言語をいろいろ見ています。(Scala,Haskellなど)

実践F#という本を読んでいます。

ちょっとこういう場合どうすればいいか、わからないことがあり質問させてください。

あるレコードが定義されている場合、
そのレコードに対して適用できる一連の関数を知る方法ってありますか?

実践F#には、同じ名前空間に、レコードと同じ名前のモジュールを定義して、
そこに関連する関数を書くとよい、とされていますが、
実際そうされているものでしょうか。

一つに、Haskellの型クラスのような仕組みがあれば、見通しがよくなると思うんですが
そういう仕組みはないんですよね? (Scalaにもなかった。。)

なにか、自分で設計する場合、他人が見てもわかりやすい方法などあれば教えてください。
よろしくお願いします。
2011/08/21(日) 20:41:30.81
レコード型のメソッドにしてみてもいいんじゃないでしょうか
2011/08/21(日) 21:20:09.09
>>154
ある型に対する一連の関数を知る方法は、簡単にはないですね。
AppDomainをリフレクションで総舐めとかすればそりゃ別ですが。

型と同名のモジュールを作ってーというお作法は、まあ、ふつうはそうするかなあと。
もちろん、ふつうじゃない場合もあるわけだけど。

Haskell型クラスが美人なのはわかりますが、すでにインターフェイスで筋通してる
.NET(あるいはJVM)においてそれを求めるのは、ちょっと難しいかなあという感想。

>>155
関数型でなくOOPで、と。ええ、おっしゃる意味は解りますが、といって、たとえば
Fooオブジェクトを必要とする振る舞いがすべてFooのメソッドとして定義されるとは
限らないわけで。BarクラスのメソッドがFooを引数に取ることだってあるでしょう。

このあたり、私は、F#においてのみ特別不便だ、とは感じません。
157b
垢版 |
2011/08/21(日) 22:37:39.67
> 149
書いた人です。指摘してくれてありがとうございます!

>・P35-P43 if式を(.NET中では)F#に特徴的、みたく書いてるけど、実はVB.NETにもif式はあるのです…
確かに、誤解を招く書き方でした・・・
一応、VBのIf式は知っていたのですが、あくまでここでは
「C#にもVBにもif文があるけど、F#にはない」
ということが言いたかったのです。

>・P85 高性能、ではなくて、高機能、では?
うわ、全く気付いていませんでした・・・高性能はおかしいですね。

>・タプルを使ったPythonでいうアンパック代入相当の構文を備えていて、
 多値関数の戻り値が(x,y) = funcHoge(a,b)みたいに自然に書ける説明が抜けてる。
これは微妙なところで、タプルのみに限った機能ではないので省きました。
例えば、
type t = { Name: string; Age: int}
という型があったとして、t型の値xに対して
let { Name = n } x
ということも可能ですし、そもそもローカル変数に限った話ではなく、
let name { Name = n } = n
のように引数に対してのマッチも可能です。
let x, y = y, x的なものを入れるかどうかは迷ったのですが、結局入れませんでした。

>・リスト操作用の組み込み高階関数の説明が無い。
これは、この時のターゲットを考えて意図的に入れませんでした。
確かに便利な高階関数は色々と用意されていますが、それを列挙する発表ってつまらなくないかなぁ、と思ったので。
ただ、LINQ to Objectには一対一で対応するものが無いような高階関数の紹介はやってもよかったかもしれません。
158b
垢版 |
2011/08/21(日) 22:39:15.22
あ、let { Name = n } = xです。
2011/08/24(水) 01:30:04.05
お!本人であるbleisさんが降臨・・・
素敵!
160デフォルトの名無しさん
垢版 |
2011/09/07(水) 22:14:16.34
F#のすごい日本人おしえれ
161デフォルトの名無しさん
垢版 |
2011/09/07(水) 22:14:49.33
いますぐフォローすべきF#の人的なやつ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況