Das scheint der mathematischere Weg zu sein
funktionale sprachen sind von lambda-kalkül inspiriert . In diesem Feld werden für die Funktionsanwendung keine Klammern verwendet.
Ich denke auch, dass der letztere Stil viel klarer und lesbarer ist als ohne die Parens.
Die Lesbarkeit liegt im Auge des Betrachters. Sie sind es nicht gewohnt, es zu lesen. Es ist ein bisschen wie mit mathematischen Operatoren. Wenn Sie die Assoziativität verstehen, benötigen Sie nur wenige Parens, um die Struktur Ihres Ausdrucks zu verdeutlichen. Oft braucht man sie nicht.
Currying ist auch ein guter Grund, diese Konvention zu verwenden. In haskell können Sie Folgendes definieren:
add :: Int -> Int -> Int
add x y = x + y
x = add 5 6 -- x == 11
f = add 5
y = f 6 -- y == 11
z = ((add 5) 6) -- explicit parentheses; z == 11
Mit parens können Sie zwei Konventionen verwenden: f(5, 6)
(nicht Curry) oder f(5)(6)
(Curry). Die haskell-Syntax hilft dabei, sich an das Currying-Konzept zu gewöhnen. Sie können immer noch eine nicht-Curry-Version verwenden, es ist jedoch schmerzhafter, sie mit Kombinatoren zu verwenden
add' :: (Int, Int) -> Int
add' (x, y) = x + y
u = add'(5, 6) -- just like other languages
l = [1, 2, 3]
l1 = map (add 5) l -- [6, 7, 8]
l2 = map (\x -> add'(5, x)) l -- like other languages
Beachten Sie, wie Sie in der zweiten Version dazu gezwungen werden, x als Variable zu registrieren, und dass der Unterausdruck eine Funktion ist, die eine Ganzzahl annimmt und 5 hinzufügt? Die Curry-Version ist viel leichter, wird aber auch von vielen als lesbarer angesehen.
Haskell-Programme verwenden in großem Umfang Teilanwendungen und Kombinatoren, um Abstraktionen zu definieren und zu komponieren. Dies ist also kein Spielzeugbeispiel. Eine gute Funktionsschnittstelle ist eine, bei der die Reihenfolge der Parameter eine benutzerfreundliche Verwendung ermöglicht.
Ein weiterer Punkt: Eine Funktion ohne Parameter sollte mit aufgerufen werden f()
. In haskell schreiben Sie einfach, da Sie nur unveränderliche, verzögert ausgewertete Werte manipulieren f
, und betrachten dies als einen Wert, der bei Bedarf einige Berechnungen durchführen muss. Da die Auswertung keine Nebenwirkungen hat, ist es nicht sinnvoll, für die parameterlose Funktion und den zurückgegebenen Wert eine andere Notation zu verwenden.
Es gibt auch andere Konventionen für die Funktionsanwendung:
- Lisp: (fx) - Präfix mit externen Klammern
- Viertens: xf - postfix