質問

タイプが 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 はシーケンス自体であるため、入力シーケンスのすべての要素を強制的にシーケンスにすることを思い出してください。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top