トピック:チラ裏.fs
コメント

- 2:いげ太
- 2008/09/18 11:42
seq
> [1; 2; 3];;
val it : int list = [1; 2; 3]
> seq [1; 2; 3];;
val it : seq<int> = [1; 2; 3]
> [|1; 2; 3|];;
val it : int array = [|1; 2; 3|]
> seq [|1; 2; 3|];;
val it : seq<int> = [|1; 2; 3|]
ちなみに、seq 
- 3:いげ太
- 2008/09/18 11:49
Seq.concat
> let xss = seq [ seq{0..1}; seq{2..3}; seq{4..5} ];;
val xss : seq<seq<int>>
> Seq.concat xss;;
val it : seq<int> = seq [0; 1; 2; 3; ...]
seq<#seq<'a>> > Seq.concat [[9;8;7]; [6;5;4]; [3;2;1]];;
val it : seq<int> = seq [9; 8; 7; 6; ...]

- 4:いげ太
- 2008/09/18 12:04
目新しいところも。CTP
> Seq.distinct [1; 4; 1; 4; 2; 1; 3; 5; 6];;
val it : seq<int> = seq [1; 4; 2; 3; ...]
重複判定に使うキー値を任意に導出したいなら、distinct_by > let alist = [1,"one"; 2,"two"; 2,"to"; 3,"three"];;
val alist : (int * string) list
> Seq.distinct_by fst alist;;
val it : seq<int * string> = seq [(1, "one"); (2, "two"); (3, "three")]
重複要素が存在すると、後の要素が消され、先の要素が生きる。
- 5:いげ太
- 2008/09/18 15:03
先頭から
> Seq.skip 1 ["list"; "1"; "2"; "3"];;
val it : seq<string> = seq ["1"; "2"; "3"]
条件が成立する間スキップするには > Seq.skip_while ((>) 10) [1; 2; 11; 12; 4; 5];;
val it : seq<int> = seq [11; 12; 4; 5]
条件が 
- 6:いげ太
- 2008/09/18 15:21
skip
> Seq.take 3 [0; 1; 2; 3; 4; 5];;
val it : seq<int> = seq [0; 1; 2]
seq > Seq.take 3 [0; 1];;
val it : seq<int>
= Error: Seq.take: the input sequence had insufficient elements
パラメータ名: n
> Seq.skip 3 [0; 1];;
val it : seq<int>
= Error: Seq.skip: the input sequence had insufficient elements
パラメータ名: n
しかし、take > Seq.truncate 3 [0; 1];;
val it : seq<int> = seq [0; 1]
条件が成立する間テイクするには > Seq.take_while ((>) 10) [1; 2; 11; 12; 4; 5];;
val it : seq<int> = seq [1; 2]

- 7:いげ太
- 2008/09/19 12:41
つまりは
> Seq.filter ((>) 10) [1; 2; 11; 12; 4; 5];;
val it : seq<int> = seq [1; 2; 4; 5]

- 8:いげ太
- 2008/09/19 12:46
つまりは
> Seq.map ((*) 2) [10; 10; 2; 3; 10];;
val it : seq<int> = seq [20; 20; 4; 6; ...]

- 9:いげ太
- 2008/09/19 15:48
「SELECT
> let family = seq ["Sazae", "Fuguta", 24;
- "Masuo", "Fuguta", 28;
- "Katsuo", "Isono", 11;
- "Wakame", "Isono", 9;
- "Tarao", "Fuguta", 3;
- "Namihei", "Isono", 54;
- "Fune", "Isono", 52];;
val family : seq<string * string * int>
> Seq.choose (fun (fnm,snm,age) ->
- if age <= 12 then Some (snm + " " + fnm) else None)
- family;;
val it : seq<string> = seq ["Isono Katsuo"; "Isono Wakame"; "Fuguta Tarao"]

- 10:いげ太
- 2008/09/19 16:15
2
> Seq.map2
- (fun fnm snm -> snm + " " + fnm)
- (seq ["Namihei"; "Fune"; "Katsuo"; "Wakame"; "Masuo"; "Sazae"; "Tarao"])
- (seq ["Isono"; "Isono"; "Isono"; "Isono"; "Fuguta"; "Fuguta"; "Fuguta"]);;
val it : seq<string>
= seq ["Isono Namihei"; "Isono Fune"; "Isono Katsuo"; "Isono Wakame"; ...]
ただ単にタプルにする(直積を取る)ってだけなら > Seq.zip
- (seq ["Namihei"; "Fune"; "Katsuo"; "Wakame"; "Masuo"; "Sazae"; "Tarao"])
- (seq ["Isono"; "Isono"; "Isono"; "Isono"; "Fuguta"; "Fuguta"; "Fuguta"]);;
val it : seq<string * string>
= seq
[("Namihei", "Isono"); ("Fune", "Isono"); ("Katsuo", "Isono");
("Wakame", "Isono"); ...]

- 13:いげ太
- 2008/09/20 00:11
map
> Seq.map_concat string (seq {10..20});;
val it : seq<char> = seq ['1'; '0'; '1'; '1'; ...]

- 14:いげ太
- 2008/09/21 16:55
「折り畳み」と呼ばれる操作。初期値に
> Seq.fold (+) 0 (seq {1..10});;
val it : int = 55
> Seq.fold (+) 0 Seq.empty;;
val it : int = 0
初期値を必要としないなら > Seq.reduce (+) (seq {1..10});;
val it : int = 55
> Seq.reduce (+) Seq.empty;;
System.ArgumentException: the input sequence was empty
パラメータ名: e
場所 Microsoft.FSharp.Collections.Seq.reduce[A](FastFunc`2 f, IEnumerable`1 i
e)
場所 <StartupCode$FSI_0003>.$FSI_0003._main()
stopped due to error
reduce > Seq.reduce;;
val it : (('a -> 'a -> 'a) -> seq<'a> -> 'a) = <fun:clo@0>
> Seq.fold;;
val it : (('a -> 'b -> 'a) -> 'a -> seq<'b> -> 'a) = <fun:clo@0_1>
> Seq.fold (fun n (s:string) -> n + s.Length) 0 ["foo"; "bar"; "baz"];;
val it : int = 9
ちなみに、(Seq.fold > Seq.sum (seq {1..10});;
val it : int = 55
> Seq.sum (Seq.empty : seq<int>);;
val it : int = 0

- 16:いげ太
- 2008/09/22 15:27
on-demand
> Seq.scan (+) 0 (seq {1..10})
- |> Seq.to_list;;
val it : int list = [0; 1; 3; 6; 10; 15; 21; 28; 36; 45; 55]
> Seq.scan1 (+) (seq {1..10})
- |> Seq.to_list;;
val it : int list = [3; 6; 10; 15; 21; 28; 36; 45; 55]
scan 余談。CTP

- 17:いげ太
- 2008/09/23 00:37
fold
> let xs = Seq.unfold (fun x -> if x <= 1024 then Some (x, 2*x) else None) 1;;
val xs : seq<int>
> Seq.to_list xs;;
val it : int list = [1; 2; 4; 8; 16; 32; 64; 128; 256; 512; 1024]
等比数列、等差数列だとありがたみがすくないから、端的な例というと結局フィボナッチ数列になっちゃう。> Seq.unfold (fun (a1,a2) -> Some (a1, (a2,a1+a2))) (1,1)
- |> Seq.take 10
- |> Seq.to_list;;
val it : int list = [1; 1; 2; 3; 5; 8; 13; 21; 34; 55]
unfold
前へ 1 次へ![]()
コメントする
[block]から[/block]までの範囲はブロック表示されます。
部分的に目立たせたい時や、引用などにお使いください。
[code]から[/code]までの範囲は等幅表示されます。
ソースコードや設定ファイルの記述などにお使いください。
コメントする権限がありません









Seq.append は seq を連結する。
演算子を作ってみるのもまた一興。