Conoce tus K nodos
Algunas de las construcciones más fuertes (para golf) en lenguajes funcionales son let ... in ...
.
Limpio, por supuesto, tiene esto y algo mejor: el #
.
¿Qué es un nodo?
Clean #
y ubicuo |
(patrón de protección) se conocen como 'expresiones de nodo'.
Cabe destacar, que le permiten programar imperatively- ish en Limpio (que es realmente bueno aquí!).
El #
(let-before):
Ambos calculan el valor de un entero dado como una cadena, multiplicado por la suma de sus 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 cómo la versión con #
es más corta y cómo podemos redefinirla s
. Esto es útil si no necesitamos el valor que tiene una variable cuando la recibimos, por lo que podemos reutilizar el nombre. ( let
puede tener problemas cuando haces eso)
Pero usar let
es más fácil cuando necesitas algo comoflip f = let g x y = f y x in g
El |
(protector de patrón):
El patrón de protección de Clean se puede usar como los de muchos otros lenguajes funcionales; sin embargo, también se puede usar como un imperativo if ... else ...
. Y una versión más corta de la expresión ternaria.
Por ejemplo, todos estos devuelven el signo de un entero:
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
Por supuesto, el último que usa la guardia más tradicionalmente es el más corto, pero el primero muestra que puede anidarlos (pero solo pueden aparecer dos cláusulas de retorno incondicionales en la misma línea en la regla de diseño), y el segundo muestra qué el primero lo hace lógicamente.
Una nota:
Puedes usar estas expresiones básicamente en cualquier lugar. En lambdas, case ... of
, let ... in
, etc.
import StdEnv
+a and b
(21 bytes) menor que%[a:r]|a= %r=a;%_=True
(22 bytes)? ¿O seríaimport StdEnv
+a=True and b=True
(31 bytes), en cuyo caso es definitivamente más corto? (Nunca he programado en Clean, por cierto)