將列表對映到不同的型別

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 的型別相同,但它也允許它們不同。在這裡你可以看到作為函式 f 的引數的'a 型別必須與 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'