3

@演算子なしでこの関数を難しい方法で実装するにはどうすればよいですか?

let rec append l i =

    (* For example, if l is a list [1;2] and i is an integer 3
              append [1;2] 3 = [1;2;3]*)
;;
4

3 に答える 3

14

既存の追加関数、または既存の関数を使用せずに、パターン マッチングのみを使用します。

let rec insert_at_end l i =
  match l with
    [] -> [i]
  | h :: t -> h :: (insert_at_end t i)

# insert_at_end [1;2] 3  ;;
- : int list = [1; 2; 3]

また、OCaml の標準ライブラリのほとんどが OCaml で書かれていることにも注意してください。ソース パッケージを読むことで、必要な関数 (この場合はほぼ必要な関数) のソース コードを取得できます。この場合:

ファイル ocaml-3.11.1/stdlib/pervasives.ml

(* List operations -- more in module List *)

let rec (@) l1 l2 =
  match l1 with
    [] -> l2
  | hd :: tl -> hd :: (tl @ l2)
于 2009-10-12T15:10:37.893 に答える
12

簡単な答えは次のとおりです。

let append l i = l @ [i]

list-append は ocaml の infix 関数として提供されている@ため、独自に展開する必要はありません。デフォルトの ocaml ディストリビューションでは末尾再帰ではありませんが、extlibを使用してソース ファイルを次のように開始できます。

open Extlib
open ExtList

そして、それは末尾再帰の@実装を提供します。末尾再帰の追加には、バッテリまたはJane Street Coreを使用することもできます。

于 2009-10-12T05:57:19.967 に答える
2

すべてを手動で行いたい場合 (それほど難しくありません)、末尾再帰の実装を次に示します。

まず、リストを反転する関数:

let mirror l =
    let rec aux accu = function
    | [] -> accu
    | h::t -> aux (h::accu) t
in aux [] l

末尾再帰を実現するために補助関数を使用することは非常に一般的です。

実際の「追加」機能は次のとおりです。

let append l i = mirror (i::(mirror l))
于 2009-10-13T22:46:59.613 に答える