F#談話室(17)
よくわからないこと
を質問したら、談
話室の神々が助
けてくれた件
@TERAMONAGI0
WHOAMI?
@teramonagi
/R/F#/C++/Ruby/VBA
.NETわからない勢
「あれ読めこれやれ」的なアドバイスを強く求めます!!!
このスライドもF#で作ってます ⇒ FsReveal
内容
よくわからなかったことをF#談話室で質問したら見事に解決して
いただきました!
以下、質問(Q)とその回答(A)が続きます
[Q1]判別共有体の要素数が欲しい
以下のコードだと、Moge |> sizeとかやると3ってなってほしい
どう書いたらいいの、僕…
1:
2:
3:
4:
5:
6:
typeHoge=
|A=1
|B=2
typeMoge=
|M1ofHoge
|M2
[A1]REFLECTION使え
Microsoft.FSharp.Reflectionを使うと良いとのことでした
今回のケースだと以下でOK、汎用的にしたければ再帰でがん
ばれ
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
letlengthtype_name=
Reflection.FSharpType.GetUnionCases(type_name)|>
Array.map(funu->
letfield=u.GetFields()
matchArray.lengthfieldwith
|0->1
|_->System.Enum.GetValues(field.[0].PropertyType)|>
Seq.cast<Hoge>|>Seq.length
)|>
Array.sum
//3と表示される
typeof<Moge>|>length
[Q2]オーバーロードし過ぎ…
格好つけようとしたらintが足せなくなった!!!
ちゃんとモジュール(名前空間?)なんかを使えってこと?
1:
2:
3:
4:
5:
6:
7:
8:
9:
typeHoge=|A|B
let(+)(lhs:Hoge)(rhs:Hoge)=
match(lhs,rhs)with
|(A,_)->A
|(_,_)->B
//動く
B+B
//この式に必要な型は Hogeですが、ここでは次の型が指定されています int
letx= 2+3
[A2]MODULEちゃんと分けるか、INLINE使
え
基本、moduleや名前空間でちゃんと分けよう
コンパイルするならinline付けておけばコンパイル時に展開され
るのでOK
[Q3]配列の最大要素のインデックスを取りた
い
indexと値をzipしてmaxby, mapi
いい書き方が知りたい
1:
2:
3:
letx=[|1;5;2;3|]
letmaxX=x|>Array.max
[|0..(Array.lengthx-1)|]|>Array.filter(funi->x.[i]=maxX)
[A3]MAPI使うといいかも?
こんなんどうでしょう
1:
2:
3:
x|>
Array.mapi(funiy->ify=maxXthenielse-1)|>
Array.filter((<>)-1)
[Q4]SYSTEM.ARRAYIS何…
Enum.GetValuesの結果がSystem.Arrayになる
F#の型に持っていくのが辛い
1:
2:
3:
4:
5:
6:
7:
typeHoge=
|A=0
|B=1
letelements=System.Enum.GetValues(typeof<Hoge>)
elements|>
Seq.cast|>
Seq.map(funo->o|>unbox<Hoge>)
[A4]普通にCASTしましょう
ダウンキャスト:?>かSeq.cast<Type>を使おう
1:
2:
elements|>Seq.cast<Hoge>
elements:?>Hoge[]
[Q5]MAPとDICTIONARYの違いがよくわか
んねぇよ…(1)
KeyValue関数使ったり使わなかったり...
.NET周りのお勉強は何をやったらいいの…
[A5]MAPとDICTIONARYの違いがよくわかん
ねぇよ…(2)
これを読めばいいのでは…?
[A5]MAPとDICTIONARYの違いがよくわかん
ねぇよ…(3)
ありがとう、 !!!ねのさん
(おまけ)数式も書けるINFSREVEAL
f(x) = +x
3 1
3
x
2
END

F#談話室(17)