(Przepraszam za dziwny tytuł, ale nie mogłem wymyślić lepszego.)Jak ma operatora, który dodaje/odejmuje zarówno wartości bezwzględne i względne, w Haskell
Dla osobistego projektu Haskell I chcą mieć pojęcia "wartości bezwzględnych" (jak częstotliwość) i wartości względne (jak stosunek dwóch częstotliwości). W moim kontekście nie ma sensu dodawać dwóch wartości bezwzględnych: można dodawać względne wartości, aby wytworzyć nowe względne wartości, i dodać względną wartość do bezwzględnej, aby wytworzyć nową wartość bezwzględną (i podobnie do odejmowania).
Mam zdefiniowane klasy typów dla tych: patrz poniżej. Należy jednak zauważyć, że operatory ##+
i #+
mają podobną strukturę (i podobnie dla ##-
i #-
). Dlatego wolałbym scalić te operatory, tak, żebym miał jednego operatora dodawania, który dodaje względną wartość (i podobnie pojedynczy operator odejmowania, co powoduje względną wartość). AKTUALIZACJA: Aby wyjaśnić, moim celem jest ujednolicenie moich ##+
i #+
w jeden operator. Moim celem jest , a nie, aby ujednolicić to z istniejącym operatorem (Num
) +
.
Jednak nie widzę, jak to zrobić z klasami typów.
Pytanie: Czy można to zrobić, a jeśli tak, to w jaki sposób? A może nie powinienem próbować?
Oto co obecnie mam:
{-# LANGUAGE MultiParamTypeClasses #-}
class Abs a where
nullPoint :: a
class Rel r where
zero :: r
(##+) :: r -> r -> r
neg :: r -> r
(##-) :: Rel r => r -> r -> r
r ##- s = r ##+ neg s
class (Abs a, Rel r) => AbsRel a r where
(#+) :: a -> r -> a
(#-) :: a -> a -> r
Myślę, że popełniłeś ten sam błąd co ja - pytanie nie dotyczy tego, jak zaimplementować klasę typu dla torsorów (lub przestrzeni afinicznych). Przeciwnie, chodzi o to, jak zunifikować operatory '. +' I '.-' W instancji 'Torsor' z bazowymi operatorami' + 'i' -'. –
@ChrisTaylor Myślę, że najlepsze, co możesz zrobić, to ujednolicić '+' z '. +', A nie odwrotnie. Albo czekanie, że ktoś ugryzie kulę i odmieni klasę 'Num' w coś bardziej elastycznego. :) – aleator