2016-09-27 2 views
0

Während ich Haskell lerne, versuche ich die Arten von clojure's Wandlern in Haskell zu verstehen.Haskell Rang n Typen & Typ Klassen Syntax

{-# LANGUAGE RankNTypes #-} 

module Transducers where 

-- r = reduced 
type Reducer r a = r -> a -> r 

type Transducer a b = forall r . Reducer r a -> Reducer r b 

Ich habe Probleme zu verstehen, wie die folgende Funktion ein:

-- type inference 
transduce :: Foldable t => (t1 -> b -> a -> b) -> t1 -> b -> t a -> b 
-- what I actually want 
transduce :: forall t1 . Foldable t => Transducer a b -> t1 -> b -> t a -> b 
transduce xform f init coll = foldl (xform f) init coll 

Diese mir Mühe gibt, wird es nicht kompilieren. Fehle ich etwas Syntax-weise? Oder ist das nicht möglich?

+1

Können Sie ein vollständigeres Beispiel geben, was Sie versuchen zu tun? Warum haben wir nicht nur Transduces :: Foldable t => Transducer a b -> Reducer r a -> r -> t b -> r? – shang

+1

Offensichtlich ist der Typ "faltbar t => Transducer a b -> t1 -> b -> t a -> b" der falsche für die gegebene Implementierung. 'xform' hat den Typ' Transducer ab', was eine Funktion ist, die für einige 'r0' einen' Reducer r0a' verwendet, aber man wendet 'xform' auf' f' an, das den Typ 't1' (einen starren Typ!) hat macht offensichtlich keinen Sinn. Der abgeleitete Typ "Faltbare t => (t1 -> b -> a -> b) -> t1 -> b -> ta -> b" ist wahrscheinlich das, was Sie wirklich wollen - das erste Argument ist kein Wandler, aber Sie können etwas übergeben, das ein Wandler ist. Wenn Sie Rückschlüsse auf Polytypen ziehen möchten, müssen Sie "Transducer" in einen neuen Typ umbrechen. – user2407038

Antwort

1

Es scheint mir, wie Sie wahrscheinlich so etwas wie

transduce :: Foldable t => Transducer a b -> Reducer r a -> r -> t b -> r 

Als user2407038 suggested gemeint, nur eine solche Phantasie Art benötigen, wenn Sie den Anrufer liefern ein Transducer erzwingen wollen. Andernfalls können Sie es zu vereinfachen

transduce :: Foldable t => (x -> Reducer r b) -> x -> r -> t b -> r 
+0

Danke, ich verstehe jetzt :) – Seneca