Kennen Sie Ihre K- Knoten
Einige der stärksten Konstrukte (zum Golfen) in funktionalen Sprachen sind let ... in ...
.
Sauber hat das natürlich auch was besseres - das #
.
Was ist ein Knoten?
Clean's #
und das allgegenwärtige |
(Pattern Guard) werden als 'Node Expressions' bezeichnet.
Bemerkenswert ist , sie ermöglichen es Ihnen imperatively- zu programmieren ish in Clean (was hier wirklich gut ist!).
Die #
(let-before):
Beide berechnen den Wert einer Ganzzahl, die als Zeichenfolge angegeben wird, multipliziert mit der Summe ihrer Zeichen
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
Beachten Sie, wie die Version mit #
kürzer ist und wie wir sie neu definieren können s
. Dies ist nützlich, wenn wir den Wert, den eine Variable beim Empfang hat, nicht benötigen, sodass wir den Namen einfach wiederverwenden können. ( let
kann dabei auf Probleme stoßen)
Die Verwendung let
ist jedoch einfacher, wenn Sie etwas benötigenflip f = let g x y = f y x in g
Die |
(Musterwache):
Der Pattern Guard von Clean kann wie in vielen anderen funktionalen Sprachen verwendet werden - er kann jedoch auch wie ein Imperativ verwendet werden if ... else ...
. Und eine kürzere Version des ternären Ausdrucks.
Diese geben beispielsweise alle das Vorzeichen einer Ganzzahl zurück:
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
Natürlich ist die letzte, die den Guard herkömmlicher verwendet, die kürzeste, aber die erste zeigt, dass Sie sie verschachteln können (in der Layoutregel können jedoch nur zwei bedingungslose Rückgabeklauseln in derselben Zeile stehen), und die zweite zeigt, was der Guard verwendet zuerst logisch.
Eine Notiz:
Sie können diese Ausdrücke grundsätzlich überall verwenden. In lambda, case ... of
, let ... in
etc.
import StdEnv
+a and b
(21 Bytes) nicht kleiner als%[a:r]|a= %r=a;%_=True
(22 Bytes)? Oder wäre esimport StdEnv
+a=True and b=True
(31 Bytes), in welchem Fall ist es tatsächlich definitiv kürzer? (Ich habe übrigens noch nie in Clean programmiert.)