Ich denke darüber nach, sowohl Currying- als auch Variadic-Funktionen in einer dynamisch typisierten funktionalen Programmiersprache verfügbar zu machen, aber ich frage mich, ob dies möglich ist oder nicht.
Hier sind einige Pseudocodes:
sum = if @args.empty then 0 else @args.head + sum @args.tail
das soll angeblich alle seine Argumente zusammenfassen. Wenn dann sum
selbst eine Zahl behandelt wird, dann ist das Ergebnis 0
. beispielsweise,
sum + 1
ist gleich 1, vorausgesetzt, dass +
nur mit Zahlen gearbeitet werden kann. Auch wenn dies sum == 0
zutrifft, sum
bleiben Wert und Funktionseigenschaft erhalten, egal wie viele Argumente gleichzeitig angegeben werden (daher "teilweise angewendet" und "variadisch"), zum Beispiel, wenn ich dies erkläre
g = sum 1 2 3
dann g
ist gleich 6
aber wir können uns noch weiter bewerben g
. Zum Beispiel g 4 5 == 15
ist wahr. In diesem Fall können wir das Objekt nicht g
durch ein Literal ersetzen 6
, da sie zwar denselben Wert ergeben, wenn sie als Ganzzahl behandelt werden, aber unterschiedliche Codes enthalten.
Wenn dieses Design in einer echten Programmiersprache verwendet wird, führt es dann zu Verwirrung oder Mehrdeutigkeit?
sum
ist 0
ohne Argument und ruft sich rekursiv mit einem Argument auf.
reduce
?
args
: empty
, head
, und tail
. Dies sind alles Listenfunktionen, was darauf hindeutet, dass es möglicherweise einfacher und unkomplizierter ist, eine Liste zu verwenden, in der sich die verschiedenen Funktionen befinden. (Also, sum [1, 2, 3]
anstatt sum 1 2 3
)