サーチ…
任意のタイプのリストの取消し
リストを逆順にするには、リスト要素がどのような型であるかは重要ではありませんが、それらが入っている順序だけです。これは汎用関数の完全な候補です。したがって、渡されるリストに関係なく同じ逆関数を使用できます。
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