2016-10-20 2 views
3

Bedenken Sie:Anweisungen in Funktionen formatieren - Regeln?

myFunction :: (Eq a) => a -> a -> [a] 
myFunction v1 v2 = statement_1.. $ statement_2... $ statement_3... 

vs

myFunction :: (Eq a) => a -> a -> [a] 
myFunction v1 v2 = statement_1 result_1 result_2 
    where 
     result_2 = statement_2 
     result_3 = statement_3 

Gibt es eine Faustregel gilt: zu welchem ​​Format in Haskell bevorzugt? Gibt es bestimmte Regeln für die Verwendung der einzelnen Versionen?

+0

Ich denke, das letztere ist lesbarer. Ich mache auch * viele * Funktionen in Imperativsprachen, wenn es zu sofort verständlichen und gut benannten Funktionen führt. Diese Frage ist jedoch zu einseitig, um gute Antworten zu erhalten. –

+0

Ich benutze letztere, wenn ich den 'result_i' Variablen aussagekräftige Namen geben kann. Ansonsten tendiere ich dazu, die erste Form zu verwenden, möglicherweise in mehreren Zeilen, und oft '.' anstelle von' $ 'für alle außer der letzten. – chi

+0

Nur eine semantische Anmerkung: Haskell hat keine Aussagen, die im Körper einer Funktion vorkommen können, nur Ausdrücke. – chepner

Antwort

3

Zunächst einmal sind diese nicht wirklich gleichwertig. f $ x $ y als f $ (x $ y) (weil infixr 0 $) analysiert, daher würde man tatsächlich die erste Version als

myFunction v1 v2 = (statement_1.. $ statement_2...) $ statement_3... 

oder schreiben muß, wenn statement_1 eigentlich nur ein einziges Symbol ist, würde ich eigentlich lieber

myFunction v1 v2 = statement_1 (statement_2...) (statement_3...) 

Eigentlich ist Ihre Frage, ob es sinnvoll ist, diesen Zwischenresultaten eigene Namen zu geben. Nun, das ist eine Frage, die wenig mit Haskell zu tun hat - sie kann auf die meisten Programmiersprachen zutreffen, obwohl nur wenige die Möglichkeit bieten, in einem einzigen Ausdruck so viel zu schreiben wie Haskell. Es kann nur beantwortet werden als: geben Sie ihnen Namen, wenn es den Code leichter verständlich macht. Vielleicht ist es schwer zu sehen, was statement_2 ... eigentlich gut sein soll, aber ein "Single-Word-Kommentar" würde es aufklären? Nun, dann nenne es einen Namen! Wenn es stattdessen nur ein kurzer Ausdruck ist und es klar ist, was es ohnehin bedeutet, würde ich mich nicht darum kümmern.

Beachten Sie, dass dies in manchen Fällen die Leistung (selbst Komplexität) beeinflussen kann, unabhängig davon, ob Sie etwas als benannte Entität definieren. Zum Beispiel, wenn result_1 eine langwierige Berechnung ist, die nicht auf v2 abhängt, macht es Sinn, es auf diese Weise schreiben:

myFunction v1 = \v2 -> statement_1 result_1 $ statement_3.. 
where result_1 = statement_2 

Auf diese Weise können Sie die Funktion teilweise anwenden, um nur das v1 Argument und damit Anteil Ein großer Teil des Rechenaufwands für mehrere Anrufe über v2, z mit map (myFunction v1₀) listOfV2s.

Verwandte Themen