2014-02-27 11 views
5

Was ist das GHC-Äquivalent von OCaml-rectypes für rekursive Typen? Ich sehe keinen in der Dokumentation. Ist es eine versteckte Funktion?Haskell entspricht -rectypes

+1

Alle Definitionen in Haskell sind rekursiv. Versuchen Sie "keinen Schalter". –

+4

@ n.m. OCaml erlaubt equirecursive Typen, die Haskell's Äquivalent von 'Typ T a = T -> a 'wäre und ähnlich – jozefg

+0

@jozefg nachgeschlagen hat. Beeindruckend. Macht das wirklich Sinn? Normalerweise ist ein solcher rekursiver Typ == ein Codierungsfehler. –

Antwort

8

Es gibt leider keinen einzigen, alle Rekursionen müssen einen Datentyp durchlaufen. Wenn Sie jedoch bereit sind, ein wenig Kopfschmerzen zu ertragen, können Sie rekursive Typen ziemlich einfach schreiben.

newtype RecArr b a = RecArr {unArr :: RecArr b a -> b} 

unfold = unArr 
fold = RecArr 

Jetzt können wir fold und unfold unsere RecArr unsere Rekursion in unseren Herzen Inhalt entfalten. Dies ist ein wenig schmerzhaft, weil es manuell, aber vollständig praktikabel ist. Als Demonstration, hier ist der y-Kombinator geschrieben mit fold und unfold.

y f = (\x -> f (unfold x x)) $ fold (\x -> f (unfold x x)) 

factorial f n = if n == 0 then 1 else n * f (n-1) 

main = print (y factorial 5) -- prints 120 
+0

Es muss einen geben. – ThePiercingPrince

+0

@ThePiercingPrince Es gibt keine ... Haskell unterstützt keine Rekursion auf Typebene, da dies einen bereits sehr komplexen Typ-Inferenz-/Prüfalgorithmus erheblich erschwert. – jozefg

1

Es gibt keine. Alle Rekursionen müssen durch nominale Typen gehen. Das heißt, Sie müssen einen Datentyp definieren.