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. ( letmoże to powodować problemy)
Ale korzystanie letjest ł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.)