1

Ocaml のリストの最後の項目を取得しようとしています。これは私が試したものです。

let last2 (xs:'a list) : 'a =
    List.fold_left (fun acc element -> let acc=element) acc xs;; 

しかし、うまくいきませんでした。私の考えでは、 acc はリストの最後の項目まで要素になります。そして、リストの最後に到達した後に acc を返すと、リストの最後の項目が表示されます。

誰か助けてくれませんか?前もって感謝します。

編集:私は次のことに近づいています

let last2 (xs:'a list) : 'a =
    List.fold_left (fun a b -> b) 1 xs;;

ただし、整数リストでは last2 しか使用できません。ポリモーフィックな last2 の方が優れています。

4

1 に答える 1

1

あなたの考えは正しいですが、それを表現するための構文が間違っています。この機能:

# fun acc element -> let acc = element;;
Error: Syntax error

正しくありません (お気づきかもしれませんが)。

値を返す関数を定義するにはexpr:

fun a b -> <expr>

式には値が必要ですb。したがって、関数は次のようになります。

fun a b -> b

(名前の変更も可能です。)

問題を見る別の方法はlet、式として使用する場合、in. したがって、次のように関数を書くことができます (冗長ですが):

fun a b -> let a = b in a

しかし、この形は命令的に考えた結果のようです。に新しい値を割り当てていませんa。値を返すだけです。

次の関数は完全に同一です。秒の名前を別の名前に変更するだけaです。

fun a b -> let zzz = b in zzz

一般的に OCaml では、変数に値を代入するという考えを放棄したいと考えています。それらは不変であり、値を変更することはできません (一般的に言えば)。

アップデート

fun a b -> bこれは、問題を解決することを示すセッションです。

$ ocaml
        OCaml version 4.00.1

# List.fold_left (fun a b -> b) 0 [2; 3; 4; 88];;
- : int = 88

忘れがちなことの 1 つは、アキュムレータの開始値を指定する必要があることです。明らかな選択肢の 1 つは、リストの最初の要素です。(最初の要素が必要です。空のリストには最後の要素ありません。)

于 2013-09-09T15:12:36.800 に答える