Top Banner
F# 談話室 (17) よくわからないこと を質問したら、談 話室の神々が助 けてくれた件 @TERAMONAGI 0
16

F#談話室(17)

Jul 17, 2015

Download

Technology

tera monagi
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: F#談話室(17)

F#談話室(17)

よくわからないことを質問したら、談話室の神々が助けてくれた件

@TERAMONAGI0

Page 2: F#談話室(17)

WHO AM I?@teramonagi/R/F#/C++/Ruby/VBA.NETわからない勢「あれ読めこれやれ」的なアドバイスを強く求めます!!!このスライドもF#で作ってます ⇒ FsReveal

Page 3: F#談話室(17)

内容よくわからなかったことをF#談話室で質問したら見事に解決していただきました!以下、質問(Q)とその回答(A)が続きます

Page 4: F#談話室(17)

[Q1]判別共有体の要素数が欲しい以下のコードだと、Moge |> sizeとかやると3ってなってほしいどう書いたらいいの、僕…

1: 2: 3: 4: 5: 6:

type Hoge = | A = 1 | B = 2type Moge = | M1 of Hoge | M2

Page 5: F#談話室(17)

[A1]REFLECTION使えMicrosoft.FSharp.Reflectionを使うと良いとのことでした今回のケースだと以下でOK、汎用的にしたければ再帰でがんばれ

1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:

let length type_name = Reflection.FSharpType.GetUnionCases(type_name) |> Array.map (fun u -> let field = u.GetFields() match Array.length field with | 0 -> 1 | _ -> System.Enum.GetValues(field.[0].PropertyType) |> Seq.cast<Hoge> |> Seq.length ) |> Array.sum//3と表示される

typeof<Moge> |> length

Page 6: F#談話室(17)

[Q2]オーバーロードし過ぎ…格好つけようとしたらintが足せなくなった!!!ちゃんとモジュール(名前空間?)なんかを使えってこと?

1: 2: 3: 4: 5: 6: 7: 8: 9:

type Hoge = | A | Blet (+) (lhs: Hoge) (rhs: Hoge) = match (lhs, rhs) with | (A, _) -> A | (_, _) -> B//動く

B + B//この式に必要な型は Hoge ですが、ここでは次の型が指定されています int let x = 2 + 3

Page 7: F#談話室(17)

[A2]MODULEちゃんと分けるか、INLINE使え

基本、moduleや名前空間でちゃんと分けようコンパイルするならinline付けておけばコンパイル時に展開されるのでOK

Page 8: F#談話室(17)

[Q3]配列の最大要素のインデックスを取りたい

indexと値をzipしてmaxby, mapiいい書き方が知りたい

1: 2: 3:

let x = [|1; 5; 2; 3|]let maxX = x |> Array.max[|0..(Array.length x - 1)|] |> Array.filter (fun i -> x.[i] = maxX)

Page 9: F#談話室(17)

[A3]MAPI使うといいかも?こんなんどうでしょう

1: 2: 3:

x |> Array.mapi (fun i y -> if y=maxX then i else -1) |> Array.filter ((<>) -1)

Page 10: F#談話室(17)

[Q4]SYSTEM.ARRAY IS 何…Enum.GetValuesの結果がSystem.ArrayになるF#の型に持っていくのが辛い

1: 2: 3: 4: 5: 6: 7:

type Hoge = | A = 0 | B = 1let elements = System.Enum.GetValues(typeof<Hoge>) elements |> Seq.cast |> Seq.map (fun o -> o |> unbox<Hoge>)

Page 11: F#談話室(17)

[A4] 普通にCASTしましょうダウンキャスト:?>かSeq.cast<Type>を使おう

1: 2: elements |> Seq.cast<Hoge>elements :?> Hoge []

Page 12: F#談話室(17)

[Q5]MAPとDICTIONARYの違いがよくわかんねぇよ…(1)

KeyValue関数使ったり使わなかったり....NET周りのお勉強は何をやったらいいの…

Page 13: F#談話室(17)

[A5]MAPとDICTIONARYの違いがよくわかんねぇよ…(2)

これを読めばいいのでは…?

Page 14: F#談話室(17)

[A5]MAPとDICTIONARYの違いがよくわかんねぇよ…(3)

ありがとう、 !!!ねのさん

Page 15: F#談話室(17)

(おまけ)数式も書ける IN FSREVEALf(x) = +x3 1

3 x2

Page 16: F#談話室(17)

END