2

タイプが('a -> 'b) list -> 'a -> 'b list

('a -> 'b) list私を最も混乱させる部分です。私は OCaml を初めて使用し、特定のデータ型の型を取得する関数の書き方を理解するのに苦労しています。

# let int x = x+1;;
# let fcn = [int; int];;

だから私は関数に関数と変数を渡しています。その変数を取得して、それをリストの各要素に追加し、リストを返しますか?

4

4 に答える 4

6

('a -> 'b)'a型から型へと移行する関数を意味します'b'a基本的に、 を受け取って返す関数のリストと'b特定の'a値を受け取り、値のリストを返す関数を作成する必要があり'bます (おそらく、関数のリストの各関数を特定の'a値に適用することによって)。

于 2012-08-15T20:53:54.837 に答える
4

これは宿題なので、完全な解決策は提供しません。mapしかし、ヒントとして、おなじみの関数のこの実装をご覧になることをお勧めします。

let rec map f = function
  | [] -> []
  | x :: xs -> f x :: map f xs

これは、ある型の値('a -> 'b) -> 'a list -> 'b listをある型の値に変換する関数を最初の引数として受け取り、2 番目の引数として型の要素のリストを取り、型の要素のリストを生成することを意味します。引数リストでパターン マッチングを行い、リストのすべての要素に関数 ( ) を再帰的に適用します。'a'b'a'bfx

ここで、作成する関数の型を見てみましょう。その関数の必要な動作について何を教えてくれますか? 関数の実装をmap念頭に置いて、関数をどのように記述しますか?

于 2012-08-15T23:03:43.243 に答える
2
('a -> 'b) list -> 'a -> 'b list

これは、関数に 2 つのパラメーターがあることを意味します。

  • type の要素をパラメーターとして取り、 type の要素を返す('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が受け入れられます。他のタイプと混同しない限り、同じことが他のタイプにも当てはまります。

于 2012-08-19T21:19:53.880 に答える