Hier ist die Prüfung Frage, dass dieser Beitrag aufgefordert:Wie bekomme ich einen Typ für eine bestimmte polymorphe Funktion und einen bestimmten Ausdruck?
Exam Frage:
Betrachten Sie die folgende Definition von binären Bäumen in Haskell.
data Tree a = Empty | Leaf a | Node (Tree a) a (Tree a)
Nach dieser Erklärung kann sein, Bäume: Empty
ein Leaf
ein Element der Art enthält, a
oder ein Node
Element vom Typ a
und zwei Tree
s enthält.
Zum Beispiel haben die folgenden Ausdrücke Typ Tree Int
:
Leaf 0
Node (Leaf 1) 2 (Leaf 3)
Die folgende Funktion ein Tree
auf eine Liste von Elementen flacht (man erinnere sich, dass die ++
Verkettungsoperator für Listen in Haskell ist).
flatten Empty = [ ]
flatten (Leaf l) = [l]
flatten (Node t1 r t2) = (flatten t1) ++ (r : (flatten t2))
i. Geben Sie einen polymorphen Typ für die Funktion flatten
an. Rechtfertige deine Antwort.
ii. Geben Sie einen Typ für den Ausdruck:
flatten (Node (Leaf 1) 2 (Leaf 3))
Begründen Sie Ihre Antwort.
Meine Frage
Ich glaube, ich die Theorie hier zu verstehen, ist es klar, dass flatten
, um seine Arbeit zu tun, es Art ist, interpretieren mehrere Typen ([ ]
, Leaf
und Node
), aber wie soll ich akzeptiert davon? Wenn ich nicht annehmen soll, dass flatten
vom gleichen Typ ist, den es akzeptiert, bin ich mir nicht sicher, wohin ich von hier aus gehen soll.
In Bezug auf den zweiten Teil der Frage, gibt es verschiedene Typen für flatten
je nachdem, ob es in Form eines Ausdruck ist? Wenn dem so ist, fühle ich mich in meiner Annahme im letzten Absatz recht, aber ich möchte den Komfort der tatsächlichen Logik auf meiner Seite haben, anstatt einfach zu raten.
Vielen Dank im Voraus.
Diese Frage bezieht sich auf die Grundlagen der Haskell-Sprache, nicht auf ihre Typentheorie, also migriere ich sie auf eine Seite über Programmierung. – Gilles
Kommentar eines Kommentars von [Anton Trunov] (http://cs.stackexchange.com/users/39226/anton-trunov), der während der Migration automatisch gelöscht wurde: "Blatt 0's (und der nächste Baum) Typ ist nicht 'Tree Int' in Haskell, es ist" Leaf 0 :: Num a => Tree a ". ** (3) ** '[]', 'Leaf' und' Node' sind keine Typen, sondern Konstruktoren. ** (4) ** Sie können den Typ eines Ausdrucks immer herausfinden, indem Sie 'ghci' hochfeuern und eine Anfrage wie diese machen 'λ>: t flatten' oder' λ>: t flatten (Knoten (Blatt 1) 2 (Blatt 3)) (es gibt keine Erklärungen, aber es ist ein sicherer Weg, um sich selbst zu überprüfen). – Gilles