質問
タイプが Nil
または Cons(value、thunk)
のいずれかである遅延リストの実装を使用しています。 thunk
ユニットからリストの残りの部分への関数です。
List.combine
と同様に機能する関数 cross
を記述しようとしています。残念ながら、構文エラーが発生しています。
open Sequence;;
let rec (cross : 'a Sequence.t -> 'b Sequence.t -> ('a * 'b) Sequence.t) = match seq1 with
Nil -> match seq2 with
Cons (value2, thunk2) -> Cons ((Nil, value2), function () -> (cross Nil (thunk2 ())))
| Cons (value1, thunk1) -> match seq2 with
Nil -> Cons ((value1, Nil), function() -> (cross Nil (thunk1 ())))
| Cons (value2, thunk2) -> Cons ((value1, value2), function() -> (cross (thunk1 ()) (thunk2 ())))
これによりエラーが発生します:
Error: Unbound value seq1
何が間違っているのですか?
更新:
このタイプはチェックしますが、探しているタイプではありません。
let rec cross (seq1 : 'a Sequence.t) (seq2 : 'b Sequence.t) : ('a * 'b) Sequence.t = match seq1 with
Nil -> match seq2 with
Cons (value2, thunk2) -> Cons ((Nil, value2), function () -> (cross Nil (thunk2 ())))
| Cons (value1, thunk1) -> match seq2 with
Nil -> Cons ((value1, Nil), function() -> (cross Nil (thunk1 ())))
| Cons (value2, thunk2) -> Cons ((value1, value2), function() -> (cross (thunk1 ()) (thunk2 ())))
val cross :
'a Sequence.t Sequence.t ->
'a Sequence.t Sequence.t -> ('a Sequence.t * 'a Sequence.t) Sequence.t =
<fun>
これは、私が望むクロスのタイプではありません。私が探しているのは:
'a Sequence.t -> 'b Sequence.t -> ('a * 'b) Sequence.t
解決
あなたは自分を蹴るつもりです... seq1はどこで定義されていますか?
let rec (cross : 'a Sequence.t -> 'b Sequence.t -> ('a * 'b) Sequence.t) =
クロスのタイプを定義しますが、変数を何にもバインドしません(推測できると思います)。
let rec cross (seq1:'a Sequence.t) (seq2:'a Sequence.t) :('a * 'b) Sequence.t =
編集:
あなたのマッチングはうまく、ミスマッチだと思います。ケースの周りで begin ... end
ブロックを使用すると、起こっているのは(そしてシーケンスがないので確認できない)、外側のマッチに意図するマッチケースが内側のものに適用され、seq2と一致します。たとえば、
match x with
| 0 -> match y with
| 1 -> "x:0, y:1"
| 2 -> match y with
| 0 -> "y:0, x:2"
空間的には見た目は良いが、2番目の一致である match y with
は | 2-&gt; ...
大文字と小文字を区別します。一致ケースを囲む being ... end
キーワードを含むバージョンがあります。 2番目のbegin ... endは必要ありませんが、わかりやすくするためにとにかく行うことをお勧めします。
match x with
| 0 -> begin match y with
| 1 -> "x:0, y:1" end
| 2 -> begin match y with
| 0 -> "y:0, x:2" end
他のヒント
最初の行では、seq1と一致させようとしていますが、この値はバインドされていないため、どこにも見つからないことになります。
それはまったく同じです:
# let t =
match t1 with
_ -> ();;
Error: Unbound value t1
引数に名前を付ける必要があります。
更新された質問について、タイプが 'a Sequence.t Sequence.t
である理由は、次の行のためです
Cons ((Nil, value2), ...)
Nil
はシーケンス自体であるため、入力シーケンスのすべての要素を強制的にシーケンスにすることを思い出してください。
このエラーは、定義されていない名前(技術的には「にバインドされている」 値")。これは、名前を誤って入力した場合に発生する可能性があります。