Chcę utworzyć kilka niezgodnych, ale poza tym równe, typy danych. Oznacza to, że chciałbym mieć sparametryzowanego typu Foo a
, a funkcje takie jakCzy mam na myśli i używam typów singleton w Haskell?
bar :: (Foo a) -> (Foo a) -> (Foo a)
bez faktycznie dbając o co a
jest. Aby wyjaśnić dalej, chciałbym system typu powstrzymać mnie od robienia
x :: Foo Int
y :: Foo Char
bar x y
podczas gdy w tym samym czasie nie troszczą się o Int
i Char
(I tylko obchodzi, że nie są one takie same) .
W moim rzeczywistym kodzie mam typ wielomianów nad danym pierścieniem. Właściwie to nie obchodzi mnie to, co nieokreślone, o ile system typów powstrzymuje mnie od dodania wielomianu wt z wielomianem w s. Jak dotąd rozwiązać to poprzez stworzenie typeclass Indeterminate
i parametryzacji mój typ wielomianu jako
data (Ring a, Indeterminate b) => Polynomial a b
To podejście czuje się zupełnie naturalne dla Ring
części dlatego zrobić dbają o których szczególności pierścień dany wielomian jest skończona . Wydaje się to bardzo wymyślne dla części Indeterminate
, jak opisano poniżej.
Powyższe podejście działa dobrze, ale jest wyrafinowane. Zwłaszcza więc ta część:
class Indeterminate a where
indeterminate :: a
data T = T
instance Indeterminate T where
indeterminate = T
data S = S
instance Indeterminate S where
indeterminate = S
(i tak dalej może być jeszcze kilka nieokreślonych). Czuje się dziwnie i źle. Zasadniczo staram się wymagać, aby instancje Indeterminate
były singletons (w this sense). Uczucie dziwności jest jednym ze wskaźników, że mogę atakować to niesłusznie. Innym jest fakt, że w końcu muszę opisywać wiele z moich Polynomial a b
s, ponieważ rzeczywisty typ b
często nie może być wywnioskowany (to nie jest dziwne, ale jest denerwujące).
Wszelkie sugestie? Czy powinienem dalej robić to w ten sposób, czy też czegoś brakuje?
PS: Nie obrażaj się, jeśli nie zareaguję natychmiastowo i nie przyjmuję odpowiedzi. Nie będę mógł wrócić z powrotem przez kilka dni.
Czy istnieje dobry powód, aby nie modelować wielomianów jako sekwencji elementów pierścienia lub czegoś podobnego (na przykład sekwencji sum częściowych)? –
Ok, jestem trochę zagubiony tutaj. Nie rozumiem, dlaczego w ogóle potrzebujesz "Nieokreślonego". Jeśli chcesz tylko wymusić, że dwa b są takie same, zostaw to w podpisie typu i to wszystko? – sclv
@Alexandre C .: Robię to. Ale chciałbym podpisu typu, aby nie miało znaczenia, powiedzmy, dodać "2 + 5t" do "6s". W przypadku wielomianu jako sekwencji elementów pierścienia, system typów (słusznie) powstrzymuje mnie przed dodaniem wielomianu o współczynnikach w jednym pierścieniu, z jednym ze współczynnikami w innym, ale nie rozróżnia on po nieokreślonych. Teraz, oczywiście, czy naprawdę potrzebuję nieokreślonych, jest bardzo ważne pytanie :-) – gspr