サーチ…
構文
[] //空のリスト。
head :: tail //要素headとリストtailを保持している構築セル。 ::はCons演算子と呼ばれます。
let list1 = [1; 2; 3] //セミコロンの使用方法に注意してください。
let list2 = 0 :: list1 //結果は[0; 1; 2; 3]
let list3 = list1 @ list2 //結果は[1; 2; 3; 0; 1; 2; 3]。 @は、追加演算子です。
let list4 = [1..3] //結果は[1; 2; 3]
let list5 = [1..2..10] //結果は[1; 3; 5; 7; 9]
let list6 = [iが1.10の場合はi%2 = 1の場合はyield i] // resultは[1; 3; 5; 7; 9]
基本的なリストの使用法
let list1 = [ 1; 2 ]
let list2 = [ 1 .. 100 ]
// Accessing an element
printfn "%A" list1.[0]
// Pattern matching
let rec patternMatch aList =
match aList with
| [] -> printfn "This is an empty list"
| head::tail -> printfn "This list consists of a head element %A and a tail list %A" head tail
patternMatch tail
patternMatch list1
// Mapping elements
let square x = x*x
let list2squared = list2
|> List.map square
printfn "%A" list2squared
リスト内の数値の合計を計算する
再帰によって
let rec sumTotal list =
match list with
| [] -> 0 // empty list -> return 0
| head :: tail -> head + sumTotal tail
上記の例では、「 list
見てください、それは空ですか?0を返します。それ以外の場合は、空ではないリストです。 [1]
、 [1; 2]
、[1; 2; 3]などです。 list
が[1]の場合、変数head
を1
、 tail
を[]
バインドし、 head + sumTotal tail
実行しhead + sumTotal tail
。
実行例:
sumTotal [1; 2; 3]
// head -> 1, tail -> [2; 3]
1 + sumTotal [2; 3]
1 + (2 + sumTotal [3])
1 + (2 + (3 + sumTotal [])) // sumTotal [] is defined to be 0, recursion stops here
1 + (2 + (3 + 0)))
1 + (2 + 3)
1 + 5
6
上記のパターンをカプセル化するより一般的な方法は、機能的な折り畳みを使うことです! sumTotal
はこれになります:
let sumTotal list = List.fold (+) 0 list
リストを作成する
リストを作成する方法は、要素をセミコロンで区切られた2つの大括弧で囲むことです。エレメントは同じタイプでなければなりません。
例:
> let integers = [1; 2; 45; -1];;
val integers : int list = [1; 2; 45; -1]
> let floats = [10.7; 2.0; 45.3; -1.05];;
val floats : float list = [10.7; 2.0; 45.3; -1.05]
リストに要素がない場合、要素は空です。空のリストは、次のように宣言できます。
> let emptyList = [];;
val emptyList : 'a list
その他の例
バイトのリストを作成するには、単純に整数をキャストします。
> let bytes = [byte(55); byte(10); byte(100)];;
val bytes : byte list = [55uy; 10uy; 100uy]
関数のリスト、前に定義した型の要素、クラスのオブジェクトのリストなどを定義することもできます。
例
> type number = | Real of float | Integer of int;;
type number =
| Real of float
| Integer of int
> let numbers = [Integer(45); Real(0.0); Integer(127)];;
val numbers : number list = [Integer 45; Real 0.0; Integer 127]
レンジ
特定のタイプの要素(int、float、char、...)では、次のテンプレートを使用して、start要素とend要素でリストを定義することができます。
[start..end]
例:
> let c=['a' .. 'f'];;
val c : char list = ['a'; 'b'; 'c'; 'd'; 'e'; 'f']
let f=[45 .. 60];;
val f : int list =
[45; 46; 47; 48; 49; 50; 51; 52; 53; 54; 55; 56; 57; 58; 59; 60]
次のモデルを使用して、特定のタイプのステップを指定することもできます。
[start..step..end]
例:
> let i=[4 .. 2 .. 11];;
val i : int list = [4; 6; 8; 10]
> let r=[0.2 .. 0.05 .. 0.28];;
val r : float list = [0.2; 0.25]
ジェネレータ
リストを作成する別の方法は、ジェネレータを使用して自動的にリストを生成することです。
次のモデルのいずれかを使用できます。
[for <identifier> in range -> expr]
または
[for <identifier> in range do ... yield expr]
例
> let oddNumbers = [for i in 0..10 -> 2 * i + 1];; // odd numbers from 1 to 21
val oddNumbers : int list = [1; 3; 5; 7; 9; 11; 13; 15; 17; 19; 21]
> let multiples3Sqrt = [for i in 1..27 do if i % 3 = 0 then yield sqrt(float(i))];; //sqrt of multiples of 3 from 3 to 27
val multiples3Sqrt : float list =
[1.732050808; 2.449489743; 3.0; 3.464101615; 3.872983346; 4.242640687; 4.582575695; 4.898979486; 5.196152423]
演算子
いくつかの演算子を使ってリストを構築することができます:
コンス演算子::
この演算子::は、ヘッド要素をリストに追加するために使用されます。
> let l=12::[] ;;
val l : int list = [12]
> let l1=7::[14; 78; 0] ;;
val l1 : int list = [7; 14; 78; 0]
> let l2 = 2::3::5::7::11::[13;17] ;;
val l2 : int list = [2; 3; 5; 7; 11; 13; 17]
連結
リストの連結は演算子@で行います。
> let l1 = [12.5;89.2];;
val l1 : float list = [12.5; 89.2]
> let l2 = [1.8;7.2] @ l1;;
val l2 : float list = [1.8; 7.2; 12.5; 89.2]