Conosci i tuoi nodi K
Alcuni dei costrutti più forti (per il golf) in linguaggi funzionali sono let ... in ....
Pulito ovviamente, ha questo e qualcosa di meglio - il #.
Cos'è un nodo?
Clean #, e l'onnipresente |(pattern guard) sono entrambi noti come "espressioni di nodo".
In particolare, essi consentono di programmare imperatively- ish in Clean (che è veramente buono qui!).
Il #(let-before):
Entrambi calcolano il valore di un numero intero dato come stringa, moltiplicato per la somma dei suoi caratteri
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
Nota come la versione con #è più corta e come possiamo ridefinirla s. Ciò è utile se non abbiamo bisogno del valore che una variabile ha quando la riceviamo, quindi possiamo semplicemente riutilizzare il nome. ( letpuò incorrere in problemi quando lo fai)
Ma usare letè più facile quando hai bisogno di qualcosa del genereflip f = let g x y = f y x in g
La |(protezione del modello):
La protezione del modello di Clean può essere utilizzata come quella di molti altri linguaggi funzionali, tuttavia può anche essere usata come un imperativo if ... else .... E una versione più breve dell'espressione ternaria.
Ad esempio, tutti restituiscono il segno di un numero intero:
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
Ovviamente, l'ultimo che usa la guardia più tradizionalmente è il più breve, ma il primo mostra che puoi annidarli (ma solo due clausole di ritorno incondizionate possono apparire sulla stessa riga nella regola di layout), e il secondo mostra quali il primo lo fa logicamente.
Una nota:
Puoi usare queste espressioni praticamente ovunque. In lambda, case ... of, let ... in, etc.
import StdEnv+a and b(21 byte) minore%[a:r]|a= %r=a;%_=True(22 byte), però? O sarebbeimport StdEnv+a=True and b=True(31 byte), nel qual caso è davvero più breve? (Non ho mai programmato in Clean, tra.)