Jestem całkowicie nowy w Haskell (a bardziej ogólnie w programowaniu funkcjonalnym), więc wybacz mi, jeśli to naprawdę podstawowe rzeczy. Aby uzyskać więcej niż smak, staram się zaimplementować w Haskell jakieś algorytmiczne rzeczy, nad którymi pracuję. Mam prosty moduł Interval
, który implementuje interwały na linii. Zawiera funkcję pomocnikanowicjusz Haskell o typach
makeInterval :: (Ord t) => t -> t -> Interval t
makeInterval l r | l <= r = Interval l r
| otherwise = error "bad interval"
i niektóre funkcje użytkowe o odstępach rodzaju
data Interval t = Interval t t
.
Tutaj interesuję się wielowymiarowymi interwałami (d-interwałami), tymi obiektami, które składają się z interwałów d. Chciałbym osobno rozważyć interwały d, które są połączeniem d rozłącznych przedziałów na linii (wiele przedziałów) od tych, które są związkiem interwału d na d oddzielnych liniach (interwał ścieżki). Z odrębnych algorytmicznych zabiegów na uwadze, że byłoby miło mieć dwa różne typy (nawet jeśli oba są wykazy odstępach tutaj), takie jak
import qualified Interval as I
-- Multilple interval
newtype MInterval t = MInterval [I.Interval t]
-- Track interval
newtype TInterval t = TInterval [I.Interval t]
aby umożliwić odrębne kontrole, np Sanity
makeMInterval :: (Ord t) => [I.Interval t] -> MInterval t
makeMInterval is = if foldr (&&) True [I.precedes i i' | (i, i') <- zip is (tail is)]
then (MInterval is)
else error "bad multiple interval"
makeTInterval :: (Ord t) => [I.Interval t] -> TInterval t
makeTInterval = TInterval
Przejdę teraz do sedna! Ale niektóre funkcje dotyczą oczywiście zarówno wielokrotnych interwałów, jak i interwałów ścieżek. Na przykład funkcja order
zwróci liczbę interwałów w wielu odstępach lub odstępach między ścieżkami. Co mogę zrobić? Dodawanie
-- Dimensional interval
data DInterval t = MIntervalStuff (MInterval t) | TIntervalStuff (TInterval t)
nie pomaga wiele, ponieważ, jeśli dobrze rozumiem (poprawcie mnie jeśli się mylę), musiałbym napisać
order :: DInterval t -> Int
order (MIntervalStuff (MInterval is)) = length is
order (TIntervalStuff (TInterval is)) = length is
i nazywają order
jak order (MIntervalStuff is)
lub order (TIntervalStuff is)
gdy is
to MInterval
lub TInterval
. Nie tak wspaniale, to wygląda dziwnie. Nie chcę też powielać funkcji (mam wiele funkcji związanych zarówno z wielokrotnymi i śledzącymi intevals, jak i kilkoma innymi definicjami d-interval, takimi jak wielokrotność długości równej i interwały ścieżek).
Pozostało mi poczucie, że całkowicie się mylę i przegapiłem jakiś ważny punkt dotyczący typów w Haskell (i/lub nie można tu zapomnieć o programowaniu OO). Więc, całkiem nowe pytanie, jaki byłby najlepszy sposób w Haskell, aby poradzić sobie z taką sytuacją? Czy muszę zapomnieć o wprowadzaniu MInterval
i TInterval
i używać tylko jednego typu?
dziękuję za pomoc,
Garulfo
Tak samo na marginesie, 'foldr (&&) True == and'. – Nefrubyr