2017-02-15 1 views
2

: Ich bin in Haskell und ich habe Probleme mit der Art desHaskell - Suche nach allgemeiner Art

f x y = f y x 

GHCI gibt mir zu finden: a-> a-> b

Aber ich verstehe nicht, Warum. Kann mir das jemand erklären?

+3

Ist es der vollständige Code? Ich bin mir nicht sicher, was Sie getan haben, aber 'f x y = f y x 'kann nur dann Sinn ergeben, wenn' x 'und' y 'den gleichen Typ haben. Dies erklärt 'a -> a'. –

+0

Ja, das ist der vollständige Code. : t f gibt mir t1 -> t1 -> t. Was du sagst, war auch mein Gedanke, aber GHCI sagt etwas anderes – user1299292

+0

Du sagst 'a -> a -> b 'in deinem OP und jetzt sagst du' t1 -> t1 -> t'. Ich folge dir nicht. Anyway 'a' bezeichnet einen beliebigen Typ wie' t1'. Das ist das gleiche. Und Sie sagen "GHCI sagt etwas anderes". Ich bin verloren. –

Antwort

10

Wenn es in Ordnung ist, sowohl x (links) als auch y (rechts) für das erste Argument f zu verwenden, müssen sie vom selben Typ sein. So kommt das a -> a von.

Ihre Funktion wird unendlich rekursiv, ohne dass etwas zurückgegeben wird. Daher können Sie korrekt behaupten, dass sie einen beliebigen Rückgabetyp hat, da es keine Situation gibt, in der ein Wert eines anderen Typs zurückgegeben wird, da dieser nie zurückgegeben wird. Hier kommt der beliebige b her.

+1

Der abgeleitete Rückgabetyp von 'f' wird aufgrund der ertragslosen unendlichen Rekursion nicht unabhängig von den Argumenttypen bestimmt. In 'f x y = f x y', 'f :: a -> b -> c', weil keine Typenkorrekturen abgeleitet werden können. In 'fxy = fyx',' f :: a -> a -> b' weil der Argumenttyp 'a' logisch erzwungen wird und der Rückgabetyp' b' nicht. – suchtgott

+0

'f x y = x + f x y 'zum Beispiel endet nie, ist aber vom eingeschränkten Typ' Num a => a -> b -> a '. Mit '(+) :: Int -> Int -> Int ', f :: Int -> a -> Int, mit einem spezifischen Rückgabetyp" Int ". – suchtgott