Ocaml خطأ في بناء الجملة
سؤال
انا استخدم تنفيذ كسول القوائم حيث النوع يمكن أن تكون إما 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
المحلول
أنت ذاهب إلى ركلة نفسك...أين 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 =
تحرير:
أعتقد مطابقة الخاص بك هو جيد ، mis-مطابقة.استخدام begin ... end
كتل حول قضايا أعتقد أن ما يحدث (وبما أنني لم يكن لديك تسلسل, لا يمكنني التحقق من) هو أن المباراة الحالات كنت تنوي الخارجي المباراة هي التي يجري تطبيقها على واحد الداخلية ، مطابقة seq2.على سبيل المثال ،
match x with
| 0 -> match y with
| 1 -> "x:0, y:1"
| 2 -> match y with
| 0 -> "y:0, x:2"
على الرغم مكانيا, يبدو على ما يرام ، والثانية المباراة ، match y with
لا بد مع | 2 -> ...
مباراة القضية.هنا هو نسخة مع being ... 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
هو سلسلة نفسها ، وذلك عن طريق وضع أن هناك قوى جميع عناصر المدخلات متواليات أن تكون متواليات أيضا.
يحدث هذا الخطأ عندما يكون لديك ذكر الاسم الذي لم يتم تحديد (من الناحية الفنية "ملزمة قيمة").قد يحدث هذا إذا كنت قد أخطأت في كتابة الاسم.