수색…


통사론

  • [] // 빈 목록.

    head :: tail // 요소, 머리 및 목록, 꼬리를 포함하는 구성 셀. ::는 단락 연산자라고합니다.

    let list1 = [1; 2; 3] // 세미콜론의 사용법에 유의하십시오.

    let list2 = 0 :: list1 // 결과는 [0; 1; 2; 삼 ]

    let list3 = list1 @ list2 // 결과는 [1; 2; 삼; 0; 1; 2; 삼 ]. @는 추가 연산자입니다.

    let list4 = [1..3] // 결과는 [1; 2; 삼 ]

    let list5 = [1..2..10] // 결과는 [1; 삼; 5; 7; 9]

    let list6 = [i가 1..10 일 경우 i % 2 = 1이면 yield I] // 결과는 [1; 삼; 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]이면 변수 head1 바인딩하고 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

위의 패턴을 캡슐화하는 좀 더 일반적인 방법은 함수 폴드 (fold)를 사용하는 것입니다! sumTotal 은 다음과 sumTotal 됩니다.

let sumTotal list = List.fold (+) 0 list

목록 만들기

목록을 만드는 방법은 두 개의 대괄호 안에 세미콜론으로 구분하여 요소를 배치하는 것입니다. 요소는 동일한 유형이어야합니다.

예:

> 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]

연산자

일부 연산자는 목록을 구성하는 데 사용될 수 있습니다.

단점 연산자 ::

이 연산자 ::는 head 요소를 목록에 추가하는 데 사용됩니다.

> 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]


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow