2011-01-16 10 views
5

WarumWarum funktionieren sowohl (^ 2) xs als auch map (2 ^) xs wie erwartet in Haskell?

map (^2) [1..10] 

Arbeit und auch

map (2^) [1..10] 

Arbeit?

Ich würde erwarten, dass es nur mit einem von ihnen funktioniert, nicht für beide.

Ich dachte Karte über alle Elemente von [1..10] laufen würde und dann

[1^2, 2^2, 3^2, ...] 

für map (^2) [1..10] tun. Dann würde ich erwarten, dass, wenn map (2^) [1..10] gegeben würde, es einen sintax Fehler oder etwas ergeben würde, weil es die Zahlen nach dem ^, nicht vorher brauchen würde.

+4

Warum erwarten Sie, dass es nur für einen von ihnen funktioniert? – sepp2k

+1

Ich muss sagen, dass ich die Frage überhaupt nicht verstanden habe, bis Luqui antwortete. Wenn Sie nur den [Haskell Report] (http://www.haskell.org/onlinereport/haskell2010/) gelesen haben, ist es offensichtlich, was '(^ 2)' und '(2 ^)' bedeuten. (Dann noch einmal, ich lese die gesamte Sprachspezifikation, bevor ich irgendeine neue Programmiersprache benutze; mir wurde gesagt, dass das eine merkwürdige Angewohnheit ist ...) – ephemient

+0

Das ist eine seltsame, aber ehrfürchtige Gewohnheit, also halte weiter so. – Davorak

Antwort

16

Die Haskell Grammatik hat spezielle Unterstützung für Konstrukte wie diese, die so genannten „Operator Abschnitte“. Wenn Sie irgendeine Infixoperator haben, wie #$% sagt, dann wird die folgende Notation wird unterstützt:

(#$%) = \x y -> x #$% y 
(#$% y) = \x -> x #$% y 
(x #$%) = \y -> x #$% y 

So werden Sie einige mathematische Konsistenz erwarten dies zu brechen, und wenn Haskell eine winzige Sprache wie Forth, würde ich geneigt sein, mit deiner Intuition übereinstimmen. Der Grund, warum es funktioniert, ist im Grunde "weil sie es geschrieben haben, so zu arbeiten".

(Es wurde auch Mehrdeutigkeit zu reduzieren hinzugefügt - f + xf auf zwei Argumente angewendet bedeutet, oder bedeutet es + auf zwei Argumente angewendet Da es eigentlich bedeutet letzteres, wie repräsentieren wir die frühere Antwort: mit? () einen Operator Abschnitt einzuführen.)

+0

Ah! "Der Grund, warum es funktioniert, ist im Grunde", weil sie es geschrieben haben, um so zu arbeiten. So sah es aus! Luqui zur Rettung, wie immer! Danke –

+2

Gut beschrieben in [Haskell Report> Expressions> Abschnitte] (http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-300003.5) –

0

(2 ^) erstellt eine neue Funktion, die einen Parameter übernimmt und (2^Parameter) aufruft. Es ist eine Art der Curryfizierung.

Hier ist ein Link mit der Theorie dahinter: Partial Application(Haskell.org)

+0

das ist nicht ganz das, wonach ich im ursprünglichen Post fragte (ich glaube, ich war nicht sehr explizit). schau dir die anderen Antworten an. danke trotzdem –

+0

ich sehe das ... Entschuldigung dafür, dass ich die Frage nicht verstehe. –

3

Haskell weiß, dass ^ ist ein Infixoperator so dass es (in mathematischer Notation) (2^) als f(x) = 2^x und (^2) als f(x) = x^2 interpretiert.

Verwandte Themen