F# 談話室 (17) よくわからないこと を質問したら、談 話室の神々が助 けてくれた件 @TERAMONAGI 0
WHO AM I?@teramonagi/R/F#/C++/Ruby/VBA.NETわからない勢「あれ読めこれやれ」的なアドバイスを強く求めます!!!このスライドもF#で作ってます ⇒ FsReveal
[Q1]判別共有体の要素数が欲しい以下のコードだと、Moge |> sizeとかやると3ってなってほしいどう書いたらいいの、僕…
1: 2: 3: 4: 5: 6:
type Hoge = | A = 1 | B = 2type Moge = | M1 of Hoge | M2
[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
[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
[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)
[A3]MAPI使うといいかも?こんなんどうでしょう
1: 2: 3:
x |> Array.mapi (fun i y -> if y=maxX then i else -1) |> Array.filter ((<>) -1)
[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>)