2017-02-13 7 views
0

Ich habe gerade angefangen zu lernen Ocaml und bin mit rekursiven Funktionen herumspielen. Ocaml Compiler sagt mir, dass rekursiv Aufruf Helper in "wenn h1 = h2 dann helfer t1 t2" verursacht einen Fehler: Dieser Ausdruck hat Typ 'eine Liste *' eine Liste -> bool, aber ein Ausdruck wurde vom Typ bool erwartet. Ich verstehe, dass es mir sagt, dass der Compiler einen booleschen Wert erwartet, aber stattdessen eine Funktion erhält, die den booleschen Wert zurückgibt. Aber ich habe keine Ahnung, wie ich das beheben kann. Jede Hilfe ist willkommenOcaml: Dieser Ausdruck hat Typ 'eine Liste *' eine Liste -> Bool aber ein Ausdruck wurde vom Typ erwartet bool

let rec a_func l = 
    let rec helper tmp l1 = function 
     | [], [] -> true 
     | _, [] -> false 
     | h1::t1, h2::t2 -> if h1=h2 then helper t1 t2 else helper [h2]@l1 t2 
    in helper [] l 

Antwort

3

Ihre Definition let rec helper tmp l1 = function ... definiert eine Funktion helper die drei Argumente nimmt: tmp, l1, und ein anonymes Argument, das in der Mustererkennung verwendet wird. Dies liegt daran, dass das Schlüsselwort function ein zusätzliches Argument einführt, es bedeutet nicht, was einen Muster-Mant auf früheren Argumenten bedeutet.

Es sieht so aus, als ob Sie auf tmp und l1 übereinstimmen möchten. In diesem Fall können Sie let rec helper tmp l1 = match tmp, l1 with ... schreiben. Sie können auch let rec helper = function ... schreiben, aber das wird eine Funktion definiert, die eine Paar nimmt, so würde man es als helper (t1, t2) nennen müssen, helper ([], l) usw.

Sie auch Klammern um [h2]@l1 setzen müssen. Beachten Sie, dass eine idiomatische Schreibweise h2::l1 ist, aber Sie brauchen immer noch die Klammern. Schließlich warnt OCaml Sie, dass Sie kein Muster für das Muster ([], _::_) haben.

+0

Vielen Dank für die Erklärung! – user1848861

Verwandte Themen