2009-11-11 7 views
10

Der Typ der Funktion Preludeflip ist:Ist es möglich, in `flip` eine unäre Funktion anstatt einer binären zu verwenden?

flip :: (a -> b -> c) -> b -> a -> c 

D.h., dauert es eine binäre Funktion und zwei Argumente.

Der Typ der Prelude Funktion id ist:

id :: a -> a 

Aber die Art der flip id ist:

flip id :: a -> (a -> b) -> b 

Wie es möglich ist, flip-id anzuwenden, wenn id eine einstellige Funktion ist und flip erfordert Binärfunktion für den ersten Arg?

btw. flip id ist ähnlich \ x f -> f x

Antwort

15

Haskell id den Typ des ersten Arguments zu flip fit macht a = b -> c indem. So:

flip :: (a  -> b -> c) -> b -> a  -> c 
flip :: ((b -> c) -> b -> c) -> b -> (b -> c) -> c 
flip id ::      b -> (b -> c) -> c 

wo id genommen ist vom Typ

id :: (b -> c) -> b -> c 

zu sein, die zu

entspricht
id :: (b -> c) -> (b -> c) 

d.h. eine Spezialisierung von id, die unären Funktionen gilt nur.

Edit: Ich glaube, ich könnte meine erste Zeile anders formulieren als: zu flipwenna = b -> c
Haskell folgert dass id den Typ des ersten Arguments passt.
Falls das klarer ist.

+0

Ich habe vergessen, dass die allgemeine Typkennung 'a' auch eine Funktion sein kann, danke. –

4

Nefrubyr erklärt es sehr gut.
Eine andere Möglichkeit, dies (hoffentlich) etwas intuitiver zu gestalten, ist die Funktion Anwendungsoperator ($).

($) ist eine spezielle Form von id:

($) :: (a -> b) -> (a -> b) 
($) = id 

ich die Definition gesehen habe (#) = flip ($), so dass Sie das Argument vor der Funktion seiner Anwendung schreiben: obj # show.

Offensichtlich, da ($) nur eine spezielle Form von id ist, könnte man auch schreiben: (#) = flip id