const
może być tylko implementacją, której szukasz w połączeniu z innymi funkcjami. Oto przykład, który odkryłem.
Powiedzmy, że chcemy przepisać strukturę 2-tek na inną strukturę 2-tek. Mogę wyrazić to jako tak:
((a,b),(c,d)) ⇒ (a,(c,(5,a)))
mogę dać prosta definicja z pasującymi Wzór:
f ((a,b),(c,d)) = (a,(c,(5,a)))
Co jeśli chcę bezcelowe (milczącej) rozwiązanie dla tego rodzaju przepisuje? Niektóre myślenie i manipulowanie później, odpowiedź brzmi, że możemy wyrazić wszelkie przeróbki z (&&&), const, (.), fst, snd
. Zauważ, że (&&&)
pochodzi z Control.Arrow
.
Roztwór przykład przy użyciu tych funkcji:
(fst.fst &&& (fst.snd &&& (const 5 &&& fst.fst)))
Uwaga Podobieństwo (a,(c,(5,a)))
. Co się stanie, jeśli zmienimy &&&
na ? Następnie czytamy:
(fst.fst, (fst.snd, (const 5, fst.fst)))
Wskazówki jak a
jest pierwszym elementem pierwszego elementu, a to, co fst.fst
projekty. Zauważ, że c
jest pierwszym elementem drugiego elementu, i to jest to, co projektuje fst.snd
. Oznacza to, że zmienne stają się ścieżką do ich źródła.
pozwala nam wprowadzić stałe. Interesujące, jak nazwa pasuje do znaczenia!
Potem uogólnić ten pomysł z aplikacyjnych, dzięki czemu można napisać dowolną funkcję w bezcelowym stylu (tak długo, jak masz analiza case dostępne funkcje, takie jak maybe
, either
, bool
). Ponownie, const
odgrywa rolę wprowadzania stałych. Możesz zobaczyć tę pracę w pakiecie Data.Function.Tacit.
Kiedy zaczynasz abstrakcyjnie, cel, a następnie pracujesz nad wdrożeniem, możesz być zaskoczony odpowiedziami Oznacza to, że każda funkcja może być tak tajemnicza, jak każde jedno ząb w maszynie. Jeśli jednak cofniesz się, aby pokazać całą maszynę, możesz zrozumieć kontekst, w którym to pokrętło jest konieczne.
Przykład: 'backgroundColor :: Text -> Color' jest dla mnie' backgroundColor = const White' – Zhen