OCaml の関数の実装を取得しましたappend
が、混乱しているようです
let rec append = function
| [] -> fun y -> y
| h :: t -> fun y -> h :: (append t y)
fun y
この場合の の目的は何ですか?
OCaml の関数の実装を取得しましたappend
が、混乱しているようです
let rec append = function
| [] -> fun y -> y
| h :: t -> fun y -> h :: (append t y)
fun y
この場合の の目的は何ですか?
の型は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
) をその前に追加することによって行われます。