2

OCaml の関数の実装を取得しましたappendが、混乱しているようです

let rec append = function
| [] -> fun y -> y
| h :: t -> fun y -> h :: (append t y)

fun yこの場合の の目的は何ですか?

4

2 に答える 2

3

の型はappendです'a list -> 'a list -> 'a list。これは、2 つのリストを受け取り、リストを返す関数と見なすことができます。しかし (OCaml では慣用的であるように) 関数はカリー化を使用して定義されます。したがって、基本レベルでappendは、最初のリストを取り、 type の関数を返します'a list -> 'a list。返された関数は、2 番目のリストを受け取り、最初のリストを前に付けます (結果を返します)。

値は、最初のリストが空のときに返されるfun y -> y関数です。append考えてみれば、これは理にかなっている。最初のリストが空の場合、2 番目のリストは変更されずに返されます。言い換えると、返される関数は恒等関数 (リストへの適用に特化したもの) とまったく違いはありません。

2 番目のケースは value を返しますfun y -> h :: (append t y)。これは似ていますが、もう少し複雑です。返された関数は、実際の追加を行う必要があります。これは、提供された 2 番目のリスト ( y) を最初のリスト ( t) の末尾に (再帰的に) 追加し、最初のリストの先頭 ( h) をその前に追加することによって行われます。

于 2013-05-18T16:13:39.843 に答える