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?
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
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