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 sum
for 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, sum
ainda 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 g
por 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?
sum
está 0
sem argumento e se chama recursivamente com um argumento.
reduce
?
args
: empty
, head
e 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
)