サーチ…


任意のタイプのリストの取消し

リストを逆順にするには、リスト要素がどのような型であるかは重要ではありませんが、それらが入っている順序だけです。これは汎用関数の完全な候補です。したがって、渡されるリストに関係なく同じ逆関数を使用できます。

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

このコードでは、要素の種類については何も仮定していません。コンパイラ(またはF#インタラクティブ)は、この関数の型シグネチャが'T list -> 'T listことを通知します。 'Tはそれが制約のないジェネリック型であることを伝えます。また、 'T 'a代わりに'aが表示されることもあります。これは一般的なプレースホルダなので、手紙は重要ではありません。 int listまたはstring listを渡すことができ、両方とも正常に動作し、それぞれint listまたはstring 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