Próbuję uzyskać liczbę naturalną na poziomie typu z prostym przykładem implementacji produktu dot. I reprezentuje iloczyn skalarny tak:Konwertowanie liczby naturalnej na typ typu na zwykły numer
data DotP (n::Nat) = DotP [Int]
deriving Show
Teraz można utworzyć monoid wystąpienie (gdzie mappend
jest rzeczywisty produkt kropka) dla każdej wielkości iloczynu skalarnego jak poniżej:
instance Monoid (DotP 0) where
mempty = DotP $ replicate 0 0
mappend (DotP xs) (DotP ys) = DotP $ zipWith (*) xs ys
instance Monoid (DotP 1) where
mempty = DotP $ replicate 1 0
mappend (DotP xs) (DotP ys) = DotP $ zipWith (*) xs ys
instance Monoid (DotP 2) where
mempty = DotP $ replicate 2 0
mappend (DotP xs) (DotP ys) = DotP $ zipWith (*) xs ys
ale chcę, aby zdefiniować wiele bardziej ogólny przypadek tak:
instance Monoid (DotP n) where
mempty = DotP $ replicate n 0
mappend (DotP xs) (DotP ys) = DotP $ zipWith (*) xs ys
nie jestem pewien, w jaki sposób przekonwertować liczbę typu jest na szereg regularnych, że mogę pracować z wewnątrz memp funkcja ty.
Edit: Byłoby też fajnie mieć funkcję dotplength :: (DotP n) -> n
który biegł w czasie O (1), po prostu patrząc na jej typ, zamiast przechodzić przez całą listę.
nie zdawałem sobie sprawy ScopedTypeVariables było coś. To znacznie ułatwia sprawę :) –