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. ( let
pode 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.)