タイプが
('a -> 'b) list -> 'a -> 'b list
('a -> 'b) list
私を最も混乱させる部分です。私は OCaml を初めて使用し、特定のデータ型の型を取得する関数の書き方を理解するのに苦労しています。
# let int x = x+1;;
# let fcn = [int; int];;
だから私は関数に関数と変数を渡しています。その変数を取得して、それをリストの各要素に追加し、リストを返しますか?
タイプが
('a -> 'b) list -> 'a -> 'b list
('a -> 'b) list
私を最も混乱させる部分です。私は OCaml を初めて使用し、特定のデータ型の型を取得する関数の書き方を理解するのに苦労しています。
# let int x = x+1;;
# let fcn = [int; int];;
だから私は関数に関数と変数を渡しています。その変数を取得して、それをリストの各要素に追加し、リストを返しますか?
('a -> 'b)
'a
型から型へと移行する関数を意味します'b
。'a
基本的に、 を受け取って返す関数のリストと'b
特定の'a
値を受け取り、値のリストを返す関数を作成する必要があり'b
ます (おそらく、関数のリストの各関数を特定の'a
値に適用することによって)。
これは宿題なので、完全な解決策は提供しません。map
しかし、ヒントとして、おなじみの関数のこの実装をご覧になることをお勧めします。
let rec map f = function
| [] -> []
| x :: xs -> f x :: map f xs
これは、ある型の値('a -> 'b) -> 'a list -> 'b list
をある型の値に変換する関数を最初の引数として受け取り、2 番目の引数として型の要素のリストを取り、型の要素のリストを生成することを意味します。引数リストでパターン マッチングを行い、リストのすべての要素に関数 ( ) を再帰的に適用します。'a
'b
'a
'b
f
x
ここで、作成する関数の型を見てみましょう。その関数の必要な動作について何を教えてくれますか? 関数の実装をmap
念頭に置いて、関数をどのように記述しますか?
('a -> 'b) list -> 'a -> 'b list
これは、関数に 2 つのパラメーターがあることを意味します。
('a -> 'b)
関数を表すリスト。ご覧のとおり、これらのタイプは抽象的であるため、インスタンスなどの任意のタイプにすることができます...'a
'b
(int -> int)
(int -> float)
'a
。この型は、関数のパラメーターと同じでなければならないことに注意してください。したがって、パラメーターとして指定した要素を使用して、結果のリストを作成します。
以下に少し例を示します。
let action l a =
let rec todo l res =
match l with
| [] -> res
| h :: t -> todo t res@[h a] in
todo l []
したがって、ここでは、任意のタイプの関数int -> int
が受け入れられます。他のタイプと混同しない限り、同じことが他のタイプにも当てはまります。