www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

axel.benz

Gepostet:
24.09.2010 11:13

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    
 
fweth

Gepostet:
24.09.2010 17:13

   
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