Je suis très nouveau à Haskell et j'essaie de créer un type qui représentera toute instance d'Integral sur un module. J'ai trouvé some example code online et je travaille avec cela, donc ma définition de type ressemble à ceci:Impossible de montrer en raison de type ambigu lors de l'utilisation Data.Reflection dans Haskell
data Zn n a = Zn !a !a
La plupart des choses fonctionnent comme je voudrais; Je peux montrer, ajouter, soustraire, etc.
instance (Integral a, Show a) => Show (Zn n a) where
show (Zn n x) = printf "(%s mod %s)" (show (mod x n)) (show n)
instance (Integral a, Reifies n a) => Num (Zn n a) where
Zn n x + Zn _ y = Zn n (mod (x + y) n)
Zn n x - Zn _ y = Zn n (mod (x - y) n)
Zn n x * Zn _ y = Zn n (mod (x * y) n)
negate (Zn n x) = Zn n (n - x)
abs = id
signum [email protected](Zn _ 0) = x
signum (Zn n _) = Zn n 1
fromInteger x = Zn n (mod (fromInteger x) n)
where n = reflect (Proxy :: Proxy n)
znToIntegral :: Integral a => Zn n a -> a
znToIntegral (Zn n x) = fromIntegral x
Cependant, je ne peux pas montrer les résultats des opérations arithmétiques sur ces types. Par exemple, dans GHCi:
*Main> let x = Zn 5 3
*Main> x
(3 mod 5)
*Main> let y = Zn 5 7
(2 mod 5)
*Main> let z = x + y
*Main> z
<interactive>:6:1:
No instance for (Integral a0) arising from a use of ‘print’
The type variable ‘a0’ is ambiguous
Note: there are several potential instances:
instance Integral GHC.Int.Int16 -- Defined in ‘GHC.Int’
instance Integral GHC.Int.Int32 -- Defined in ‘GHC.Int’
instance Integral GHC.Int.Int64 -- Defined in ‘GHC.Int’
...plus 9 others
In a stmt of an interactive GHCi command: print it
J'ai trouvé cette question a été soulevée dans un certain nombre d'autres moyens que j'ai essayé de mettre en œuvre ces chiffres, et de comprendre comment fonctionne le paquet Data.Reflection me donne quelques problèmes. Je serais également curieux de connaître d'autres implémentations qui semblent plus naturelles aux autres. J'avais initialement essayé de faire quelque chose comme
newtype Zn n a = Zn a
et allumé parce que je pensais que ce serait simplifier les choses, qu'il n'a pas en particulier. À votre santé!