1

この関数の最後の行で構文エラーが発生します。

let rec countAll(doorlist, count) =
    let listdoor = [];
    countZero(doorlist, count) :: listdoor;
    countOne(doorlist, count) :: listdoor;
    countTwo(doorlist, count) :: listdoor;;

Ocaml 関数から何かを返す方法について混乱するかもしれません。関数countZero、countZero、およびcountTwoの出力を含むリストであるはずの「listdoor」を返したいと思います。

このコードの最後の lint、最後の数文字で構文エラーが発生します。

File "MonteeHall.caml", line 30, characters 38-40:
Error: Syntax error
4

2 に答える 2

3

ジェフリーの答えに追加するには、3 つのステップで listdoor にアイテムを追加するつもりだったようです。混乱は、ocamlの;andの意味に関するものです。::そして、あなたも私も、他の言語で行ったように、一連のステップを実行してプログラミングする習慣があります。

の右側にあるものはすべて=、関数の戻り値に評価される 1 つの大きな式です。これが、ocaml の関数から値が返される方法です。

式に が含ま;れている場合、;は部分式間の区切り文字です。各部分式が評価され、最後の部分式以外のすべての戻り値が破棄されます (ただし、これらの部分式は役に立たないわけではありません。使用する理由は、;副作用を蓄積するためです)。

しかし、これ::は副作用としては機能しません。cons は、戻り値を持つ単なる関数です。

したがって、行countZero(doorlist,count) :: listdoorcountOne(doorlist,count) :: listdoor それぞれが新しいリストを作成しましたが、それらのリストはそれぞれ破棄されました。

同じ意味を維持し、順番にリストを作成したい場合は、let と in を使用して累積のステップを保存することでそれを行うことができます。

let countAll(doorlist,count) =
    let step1 = [] :: countZero(doorlist,count) in
    let step2 = step1 :: countOne(doorlist,count) in
    let step3 = step2 :: countTwo(doorlist,count) in
    ステップ3
;;

これらすべての中間名を保持することが、投稿で念頭に置いていた一連の連結よりも効率が悪いと思われる場合は、この種のことは、口頭での説明に似た方法で関数を表現すると、より簡潔になるためです。他の言語で思いつくように奨励された順次的な方法。3 つの関数の結果をリストにまとめたい場合は、次のように簡単に実行できます。

let collectResults (a,b) =
    [ fun1 (a,b) ; fun2 (a、b) ; fun3 (a,b) ]
;;

戻り値 ( の右側のすべて=) が、関数に指定した説明とどのように一致するかがわかりますか: 「これは、関数の出力を含むリストであるはずです」? ;(注: 角括弧内のセミコロンは、リスト内の要素を区切ります。以前のとは意味が異なります!)

その他の2つのマイナーポイント:

定義している関数がそれ自体を呼び出さない場合は、'rec' と宣言する必要はありません。しかし、Jeffrey の予感は正しいのかもしれません。実際、あなたはここのどこかで再帰呼び出しを行うつもりでした。

戻り値に名前を付ける必要はありません (あなたの場合は listdoor です)。関数の定義がこのように非常に短い場合は、定義自体を戻り値の「ラベル」にします。最後のコード ブロックでは、関数は返すリストに名前を付けません。

于 2012-09-29T09:59:38.160 に答える
2

私が見た最大の問題はlet x = value、トップレベルでのみ意味があるということです。他の構造内で使用できる唯一の形式は ですlet x = value in y。だから、あなたはそのin部分を見逃しています。

一般的に;、最初は控えめに使用することをお勧めします。OCaml 関数は 1 つの大きな式 (値を持つ) と考える必要があります。一連のアクション (やるべきこと) を持つ手続き型言語とは異なります。

于 2012-09-27T18:00:33.710 に答える