Conheça seus nós K
Algumas das construções mais fortes (para o golfe) em linguagens funcionais são let ... in ....
Limpo, claro, tem isso, e algo melhor - o #.
O que é um nó?
Clean's #e onipresente |(padrão de guarda) são conhecidos como 'expressões de nó'.
Notavelmente, eles permitem programar imperatively- ish em Limpo (que é realmente bom aqui!).
O #(let-before):
Ambos calculam o valor de um número inteiro dado como uma string, multiplicado pela soma de seus caracteres
f s=let i=toInt s;n=sum[toInt c\\c<-:s]in n*i
f s#i=toInt s
#s=sum[toInt c\\c<-:s]
=s*i
Observe como a versão com #é mais curta e como podemos redefinir s. Isso é útil se não precisarmos do valor que uma variável possui quando a recebemos, para que possamos apenas reutilizar o nome. ( letpode ter problemas quando você faz isso)
Mas usar leté mais fácil quando você precisa de algo comoflip f = let g x y = f y x in g
O |(protetor de padrão):
A proteção de padrões do Clean pode ser usada como em muitas outras linguagens funcionais - no entanto, também pode ser usada como um imperativo if ... else .... E uma versão mais curta da expressão ternária.
Por exemplo, todos eles retornam o sinal de um número inteiro:
s n|n<>0|n>0=1= -1
=0
s n=if(n<>0)if(n>0)1(-1)0
s n|n>0=1|n<0= -1=0
Obviamente, o último que usa a proteção mais tradicionalmente é o mais curto, mas o primeiro mostra que você pode aninhar eles (mas apenas duas cláusulas de retorno incondicionais podem aparecer na mesma linha na regra de layout), e o segundo mostra o que o primeiro faz logicamente.
Uma nota:
Você pode usar essas expressões basicamente em qualquer lugar. Em lambdas, case ... of, let ... in, etc.
import StdEnv+a and b(21 bytes) não é menor que%[a:r]|a= %r=a;%_=True(22 bytes)? Ou seriaimport StdEnv+a=True and b=True(31 bytes); nesse caso, é definitivamente mais curto? (Eu nunca programado em Limpo, btw.)