Powiedzmy, że mam funkcję, która wykonuje pewne obliczenia, z kilkoma wzorami; realizowane w postaci dopasowywania wzorców.Czy Haskell dopuszcza wyrażenie let dla wielu wzorców dopasowania?
Większość z tych wzorów (wraz z innymi rzeczami, które różnią się od siebie) traktuje parametr, dla którego używam zmiennej pośredniej w wyrażeniu let
. Ale uważam, że jest naprawdę zbędne mieć ten sam let
na wielu wzorcach, i zastanawiam się, czy istnieje sposób zdefiniowania let
dla kilku wzorców?
Oto przykład z moim powielane let
:
data MyType a = Something a | Another Int [a]
myFunc (Something x) = -- return something, this isn't the point here
myFunc (Another 0 xs) =
let intermediary = some $ treatment xs
in doSthg intermediary 1
myFunc (Another 1 (x:xs)) =
let intermediary = some $ treatment xs
in doSthg1 intermediary 1 x
myFunc (Another 2 (x:x':xs)) =
let intermediary = some $ treatment xs
in doSthg2 intermediary 2 x x'
Można zobaczyć, że parametr xs
występuje zawsze, gdy używam go do intermediary
, a to może być factorised. Można to łatwo osiągnąć za pomocą funkcji pomocnika, ale zastanawiałem się, czy to, o co pytam, jest możliwe bez niego. Staraj się zachować prostotę dla początkujących i mam nadzieję, że mój przykład jest wystarczająco jasny.
Nie! Musimy użyć oddzielnej funkcji i przekazać ją jako parametr jawnie, aby wyodrębnić powtarzający się kod. Jeśli chodzi o Haskella, powyższe wystąpienia 'xs' są całkowicie różnymi zmiennymi (ponieważ mają różne miejsca wiązania). – luqui
Dzięki! Teraz mam inne pytanie: czy planowałeś, że równania trzecie i czwarte nigdy się nie zgadzają? Ponieważ 'xs' pasuje do dowolnej listy ... Czy odwróciłeś kolejność równań? – yatima2975
Napisałem to, aby zilustrować, że 'xs' jest wyodrębniane z dopasowywania wzorca w kilku wzorach, ale nie zawsze ma to samo znaczenie (w przeciwnym razie dopasowanie wzorca nie byłoby interesujące: byłby tylko jeden wzorzec). To, co w tym przypadku zostało zrobione, nie jest ważne; ale w moim kodzie "y" jest zastępowane rzeczywistymi wartościami, więc późniejsze wzory pasują do siebie. Ale masz rację, więc zmienię go na konkretny typ, aby wszystko było bardziej zrozumiałe. –