Poznaj swoje węzły K.
Niektóre z najsilniejszych konstrukcji (do gry w golfa) w językach funkcjonalnych to let ... in ...
.
Oczyścić, oczywiście, ma to i coś lepszego - #
.
Co to jest węzeł?
Zarówno Clean #
, jak i wszechobecny |
(ochrona wzorca) są znane jako „wyrażenia węzłów”.
Warto zauważyć, że pozwalają na zaprogramowanie imperatively- owski w czysty (co jest naprawdę dobre tutaj!).
#
(Let-wcześniej):
Oba obliczają wartość liczby całkowitej podanej jako ciąg, pomnożonej przez sumę jej znaków
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
Zwróć uwagę, że wersja z #
jest krótsza i jak możemy przedefiniować s
. Jest to przydatne, jeśli nie potrzebujemy wartości, którą ma zmienna, gdy ją otrzymujemy, więc możemy po prostu ponownie użyć nazwy. ( let
może to powodować problemy)
Ale korzystanie let
jest łatwiejsze, gdy potrzebujesz czegoś takiegoflip f = let g x y = f y x in g
|
(Strażnik wzorzec):
Ochrona wzoru Clean może być używana tak jak w wielu innych językach funkcjonalnych - jednak może być również używana jako imperatyw if ... else ...
. I krótsza wersja wyrażenia potrójnego.
Na przykład wszystkie zwracają znak liczby całkowitej:
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
Oczywiście ostatni, który tradycyjnie używa wartownika, jest najkrótszy, ale pierwszy pokazuje, że można je zagnieżdżać (ale tylko dwie bezwarunkowe klauzule powrotu mogą pojawiać się w tej samej linii w regule układu), a drugi pokazuje, co pierwszy robi to logicznie.
Notka:
Możesz używać tych wyrażeń w zasadzie wszędzie. W lambdas, case ... of
, let ... in
, itd.
import StdEnv
+a and b
(21 bajtów) nie jest mniejszy niż%[a:r]|a= %r=a;%_=True
(22 bajtów)? A może byłby toimport StdEnv
+a=True and b=True
(31 bajtów), w którym to przypadku rzeczywiście jest zdecydowanie krótszy? (Nigdy nie programowałem w Clean, btw.)