Estou pensando em disponibilizar funções variadas e currying em uma linguagem de programação funcional de tipo dinâmico, mas me pergunto se é possível ou não.
Aqui estão alguns pseudocódigo:
sum = if @args.empty then 0 else @args.head + sum @args.tail
que supostamente soma todos os seus argumentos. Então, se sumfor tratado um número, o resultado será 0. por exemplo,
sum + 1
é igual a 1, assumindo que +só possa funcionar em números. No entanto, mesmo sum == 0é verdade, sumainda manterá seu valor e propriedade funcional, independentemente de quantos argumentos sejam fornecidos (portanto, "parcialmente aplicado" e "variável" ao mesmo tempo), por exemplo, se eu declarar
g = sum 1 2 3
então gé igual a 6, no entanto, ainda podemos aplicar g. Por exemplo, g 4 5 == 15é verdade. Nesse caso, não podemos substituir o objeto gpor um literal 6, porque, embora eles produzam o mesmo valor quando tratados como um número inteiro, eles contêm códigos diferentes.
Se esse design for usado em uma linguagem de programação real, causará alguma confusão ou ambiguidade?
sumestá 0sem argumento e se chama recursivamente com um argumento.
reduce?
args: empty, heade tail. Essas são todas as funções de lista, sugerindo que talvez a coisa mais fácil e direta a ser feita seria usar uma lista onde as coisas variadas seriam. (Então, sum [1, 2, 3]em vez de sum 1 2 3)