7

Ich versuche, die Art des folgenden Ausdrucks zu folgern:Herleitung rekursive Ausdrücke Hindley Milner & Zwänge

let rec fix f = f (fix f) 

, die den Typ (a -> a) -> a

unten nach oben Algorithmus Nach der Verwendung von (beschrieben gegeben werden sollte, in verallgemeinernde hindley-milner Typ Inferenzalgorithmen) mit der zusätzlichen Regel unter:

  a1, c1 |-BU e1 : t1  B = fresh var 
--------------------------------------------------------- 
a1\x, c1 U {t' == B | x : t' in A} |-BU let rec x = e1 : t 

i mit folgenden Art bin übrig geblieben: t1 -> t2

und die folgenden Einschränkungen:

t0 = fix 
t1 = f 
t2 = f (fix f) 
t3 = f 
t4 = fix f 
t5 = fix 
t6 = f 

t3 = t1 
t3 = t4 -> t2 
t5 = t0 
t5 = t6 -> t4 
t6 = t1 

Ich kann nicht sehen, wie diese Einschränkungen so gelöst werden können, dass i (a -> a) -> a mit dem Typ links bin. Ich hoffe, es ist offensichtlich für jemanden zu sehen, wo ich falsch liege.

full source code here

+0

Bitte beachten Sie, dass 'let rec' einfach' let' sein sollte, ansonsten definieren Sie einfach eine Funktion 'rec :: ((a -> b) -> a) -> (a -> b) -> b'. –

+2

@ Pthariens'Flame Entschuldigung Code Beispiel war nicht in Haskell, sondern eine ML-Stil Sprache. –

+0

Okay, es ist nur so, dass du die Frage mit "haskell" versehen hast, also nahm ich an, dass das die Sprache war mit der du gearbeitet hast. Es tut uns leid! –

Antwort

7

Sollte es keine t7 zum ersten fix f sein? Diese geben die Einschränkungen:

t7 = t2 
t0 = t1 -> t7 

Von dass Sie sollten in der Lage, dass t4 = t2 und dann t0 = (t2 -> t2) -> t2 abzuleiten.

+1

Sie waren genau richtig, ich habe B in der oben genannten Regel nicht eingeschränkt! –