Gepostet: |
Funktionsverkettungs-Operator | ||||||||||
Hallo, ich verstehe folgendes nicht: cbinary :: a -> b -> (a -> b -> b) -> (b -> c) -> c -- Version 1 funktioniert: cbinary x y f g = g (f x y) -- Version 2 sollte genau das selbe sein, -- wenn ich die Definition des "." Funktionsverkettungs-Operators zugrunde lege, -- Ergibt aber folgenden Fehler: -- Occurs check: cannot construct the infinite type: b = b -> b -- When generalising the type(s) for `cbinary' cbinary x y f g = (g . f) x y Warum? |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Das Problem ist folgendes: a -> b -> b wird ja geklammert als a -> (b -> b). Die Deklaration von dem Punktoperator ist (.) :: (a -> b) -> (c -> a) -> c -> b Das heißt, um den Punktoperator auf Dein f vom Typ a -> (b -> b) und Dein g vom Typ b -> c anzuwenden, müsste der Typ b gleich dem Typ b -> b sein, also wiederum gleich dem Typ (b -> b) -> (b -> b) usw. deswegen auch der infinite type Fehler. Wenn Du zB. deklarieren würdest cbinary :: (a, b) -> ((a, b) -> b) -> (b -> c) -> c cbinary (x, y) f g = (g . f) (x, y) Könntst Du den Punktoperator so verwenden. Gruß, fweth |
|||||||||||
Zum Seitenanfang | |||||||||||