수색…


모든 유형의 목록 취소

목록을 뒤집으려면 목록 요소의 유형이 중요하지 않습니다. 목록의 요소가 어떤 순서인지는 중요하지 않습니다. 이는 일반 함수에 대한 완벽한 후보이므로 전달되는 목록이 무엇이든 관계없이 동일한 역방향 함수를 사용할 수 있습니다.

let rev list =
    let rec loop acc = function
        | []           -> acc
        | head :: tail -> loop (head :: acc) tail
    loop [] list

코드는 요소 유형에 대한 가정을하지 않습니다. 컴파일러 (또는 F # 대화식)는이 함수의 타입 시그니처가 'T list -> 'T list 임을 알려줍니다. 'T 는 제약이없는 제네릭 형식이라는 것을 알려줍니다. 'a 대신 'T 'a 표시 될 수도 있습니다. 문자는 중요하지 않으므로 일반적인 자리 표시 자일뿐입니다. 우리는 int liststring list 전달할 수 있으며, 둘 다 성공적으로 작동하여 각각 int liststring list 리턴한다.

예를 들어, F # interactive :

> let rev list = ...
val it : 'T list -> 'T list
> rev [1; 2; 3; 4];;
val it : int list = [4; 3; 2; 1]
> rev ["one", "two", "three"];;
val it : string list = ["three", "two", "one"]

목록을 다른 유형으로 매핑하기

let map f list =
    let rec loop acc = function
        | []           -> List.rev acc
        | head :: tail -> loop (f head :: acc) tail
    loop [] list

이 함수의 시그니처는 ('a -> 'b) -> 'a list -> 'b list 이며 가장 일반적인 수식입니다. 이것은 막을 수 없습니다 'a 인 동일한 유형되는 것을 'b , 그러나 그것은 또한 그들이 다를 수 있습니다. 여기에서 'a 함수 f 에 대한 매개 변수 인 형식이 list 매개 변수의 형식과 일치해야합니다. 이 함수는 여전히 일반적인 기능이지만 입력에 약간의 제약이 있습니다. 유형이 일치하지 않으면 컴파일 오류가 발생합니다.

예 :

> let map f list = ...
val it : ('a -> 'b) -> 'a list -> 'b list
> map (fun x -> float x * 1.5) [1; 2; 3; 4];;
val it : float list = [1.5; 3.0; 4.5; 6.0]
> map (sprintf "abc%.1f") [1.5; 3.0; 4.5; 6.0];;
val it : string list = ["abc1.5"; "abc3.0"; "abc4.5"; "abc6.0"]
> map (fun x -> x + 1) [1.0; 2.0; 3.0];;
error FS0001: The type 'float' does not match the type 'int'


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