2

Nilタイプが または のいずれかCons (value, thunk)である遅延リストの実装を使用しています。ここで、thunkはユニットからリストの残りの部分への関数です。

関数を作成しようとしていますcrossが、これは機能List.combineします。残念ながら、構文エラーがあります。

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
4

4 に答える 4

4

あなたは自分自身を蹴るつもりです... 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 -> ...をキーワードで囲んだバージョンです。being ... end2 番目の 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
于 2009-10-29T19:04:06.343 に答える
2

更新された質問については、タイプの理由は'a Sequence.t Sequence.t行のためです

Cons ((Nil, value2), ...)

それ自体がシーケンスであることを思い出してください。そのNilため、そこに置くことで、入力シーケンスのすべての要素も強制的にシーケンスになります。

于 2009-10-29T20:39:39.817 に答える
2

最初の行では、seq1 と照合しようとしていますが、この値はバインドされていないため、どこにも見つかりません。

それはまったく同じです:

# let t =
  match t1 with
  _ -> ();;
Error: Unbound value t1

引数に名前を付ける必要があります。

于 2009-10-29T19:04:37.013 に答える
0

このエラーは、定義されていない (技術的には「値にバインドされた」) 名前を指定した場合に発生します。これは、名前を間違って入力した場合に発生する可能性があります。

于 2015-07-27T17:59:38.663 に答える