2017-10-19 5 views
0

ich eine Funktion in OCaml haben, die zwei Listen zusammenführen sollte: aus irgendeinem GrundDieser Ausdruck hat Typ ‚eine Liste, sondern Ausdruck wurde vom Typ erwartet‘ ein

let rec merge (list1, list2) = 
    match (list1, list2) with 
     ([], []) -> merge (List.tl list1, List.tl list2) :: List.hd list1 :: List.hd list2 
     |(_, []) -> merge (List.tl list1, list2) :: List.hd list1 
     |([], _) -> merge (list1, List.tl list2) :: List.hd list2;; 

aber der Compiler lässt nicht diesen Code durch mit dem Beenden:

Error: This expression has type 'a list but an expression was expected of type 'a The type variable 'a occurs inside 'a list

Wie kann ich angeben, dass diese Listen von ‚ein ich versuche Pass nicht‘ a?

Antwort

2

Zunächst wird diese Funktion nicht funktionieren. Wenn die zwei Listen leer sind, verschmelzen Sie den Schwanz und verketten den Kopf von jedem von ihnen, aber ... naja ... sie sind leer ...

Ihr Problem ist, dass Sie den Operator :: verwenden (Verkettung), deren Typ ist 'a -> 'a list -> 'a list so sollte das linke Mitglied ein Element sein und das Recht eine Liste, hier ist die linke die Liste und die rechte das Element, so dass es nicht funktionieren kann.

Über Ihre Frage, da der Typ abgeleitet ist, können Sie den Compiler kann nicht sagen, dass Sie Recht haben und er ist falsch, der Fehler in diesem Fall wirklich explizit war:

immer
List.tl l (* 'a list *) :: List.hd l (* 'a *) 

wird eine Rückkehr Fehler, weil Sie eine unendliche Art haben (da :: vom Typ 'a -> 'a list -> 'a list, lasse ich Sie versuchen, einen endlichen Typen zu bestimmen 'a, die mit Ihrer Verkettung passen könnte)

Also, ich denke, was Sie wollen, etwas zu tun ist wie folgt:

let rec merge (list1, list2) = 
    match list1, list2 with 
     | [], _ -> list2;; 
     | hd :: tl, _ -> hd :: merge tl list2 
Verwandte Themen