سؤال

انا استخدم تنفيذ كسول القوائم حيث النوع يمكن أن تكون إما 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 هو سلسلة نفسها ، وذلك عن طريق وضع أن هناك قوى جميع عناصر المدخلات متواليات أن تكون متواليات أيضا.

يحدث هذا الخطأ عندما يكون لديك ذكر الاسم الذي لم يتم تحديد (من الناحية الفنية "ملزمة قيمة").قد يحدث هذا إذا كنت قد أخطأت في كتابة الاسم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top