2016-07-23 17 views
0

Ich bin ziemlich verwirrt über ($) in Haskell.

wenn ich

:t ($) 

in GHCI geben. Ich werde

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

erhalten, aber, wenn ich

:t ($ 3) 

geben werde ich

($ 3) :: Num a => (a -> b) -> b 

so erhalten, warum ($) ohne Fehler das zweite Argument akzeptieren?

+1

Die Funktion '($)' ist in der Tat eine gewöhnliche Haskell-Funktion, aber sie ist auch ein Infix-Operator, ebenso wie alle Funktionen, deren Namen nur symbolisch sind. Infix-Operatoren haben eine spezielle partielle Anwendungssyntax namens * operator sections *, und Sie können mehr über sie hier lesen: https://wiki.haskell.org/Section_of_an_infix_operator –

+0

@Alexis King, [nicht so gewöhnlich] (http: // www. mail-archive.com/[email protected]/msg18923.html). – user3237465

+1

@ user3237465 Ich bin mir dessen eigentlich ziemlich bewusst, aber das zu einem Lernenden zu bringen wird nur völlig unnötige Verwirrung verursachen. –

Antwort

8

Nun ($) ist ein Operator, der eine Infix-Funktion ist. Es ist Definition ziemlich einfach ist (in der Tat das einzige, was es interessant ist seine fixity, und ich bin sicher, dass Google Tonnen von Ressourcen auf das hat, macht):

($) :: (a -> b) -> a -> b 
f $ x = f x 

Wie alle Operatoren können Sie sections nehmen indem Sie nur das erste oder nur das zweite Argument anwenden. Dies könnte noch deutlicher mit dem Zusatz (+) Betreiber:

(+ 2) -- equivalent to \x -> x + 2 
(2 +) -- equivalent to \x -> 2 + x 

Das gleiche gilt für ($ 3) - es entspricht \f -> f $ 3. Der Typ dieser Funktion sollte dann ziemlich klar sein: sein Argument f muss selbst eine Funktion sein, die eine Zahl nimmt und etwas anderes zurückgibt (f :: Num a => a -> b), und die ganze Funktion gibt den gleichen Typ zurück wie f zurückgibt. Das ergibt

(\f -> f $ 3) :: Num a => (a -> b) -> b 

Und folglich ($ 3) :: Num a => (a -> b) -> b.

+0

Wenn (3 $) dann was wäre der Fall? Ich denke, es würde kein Ergebnis bringen. Verwenden Sie mit Karte (3 $) [\ x-> x + 10], richtig? – MD05

+1

'(3 $)' wird nicht überprüft. '$' erwartet, dass das erste Argument eine Funktion ist. – Alec