Connaissez vos nœuds K
Certaines des constructions les plus solides (pour le golf) dans les langages fonctionnels sont let ... in ...
.
Propre bien sûr, a cela, et quelque chose de mieux - le #
.
Qu'est-ce qu'un nœud?
Les nettoyages #
et l'omniprésence |
(pattern guard) sont tous deux connus comme des «expressions de nœuds».
Notamment, ils vous permettent de programmer imperatively- ish en propre ( ce qui est vraiment bon ici!).
Le #
(let-before):
Ces deux calculent la valeur d'un entier donné sous forme de chaîne, multiplié par la somme de ses caractères
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
Notez comment la version avec #
est plus courte et comment nous pouvons redéfinir s
. Ceci est utile si nous n'avons pas besoin de la valeur d'une variable lorsque nous la recevons, nous pouvons donc simplement réutiliser le nom. ( let
peut rencontrer des problèmes lorsque vous faites cela)
Mais l'utilisation let
est plus facile lorsque vous avez besoin de quelque chose commeflip f = let g x y = f y x in g
Le |
(modèle de garde):
Le modèle Pattern Guard peut être utilisé comme ceux de nombreux autres langages fonctionnels - mais il peut également être utilisé comme un impératif if ... else ...
. Et une version plus courte de l'expression ternaire.
Par exemple, ceux-ci renvoient tous le signe d'un entier:
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
Bien sûr, la dernière qui utilise la garde plus traditionnellement est la plus courte, mais la première montre que vous pouvez les imbriquer (mais seules deux clauses de retour inconditionnelles peuvent apparaître sur la même ligne dans la règle de disposition), et la seconde montre ce que le le premier le fait logiquement.
Une note:
Vous pouvez utiliser ces expressions pratiquement n'importe où. En lambdas, case ... of
, let ... in
, etc.
import StdEnv
+a and b
(21 octets) plus petit que%[a:r]|a= %r=a;%_=True
(22 octets), cependant? Ou serait-ceimport StdEnv
+a=True and b=True
(31 octets), auquel cas il est en effet nettement plus court? (Je n'ai jamais programmé en Clean, en passant.)