2 votes

Changer le type de variable pour correspondre au type attendu

Dans le code suivant, je reçois l'erreur

Impossible de faire correspondre le type 'Integer' avec 'Int'
Type attendu : [(Test, [Test])]
Type réel : [(Integer, [Integer])]

lors de l'exécution

testFunc test

avec la déclaration suivante

type TestType = Int
a = [(1,[2,3])]

testFunc :: [(TestType ,[TestType])] -> TestType 
testFunc ((a,(b:c)):d) = a

Comment dois-je déclarer ma liste a pour qu'elle corresponde au type de testFunc?

Et y a-t-il un moyen de corriger l'erreur sans modifier type Test = Int ou la déclaration de a?

4voto

leftaroundabout Points 23679

Comment déclarer ma liste 'test' pour qu'elle corresponde au type de testFunc?

Eh bien, en déclarant ceci comme le type.

a :: [(TestType, [TestType])]
a = [(1,[2,3])]

En général, vous devriez toujours donner des signatures de type explicites pour les définitions de niveau supérieur comme celle-ci. Sans une telle signature, le compilateur en choisira une pour vous. En général, Haskell essaie de choisir le type le plus général disponible possible; dans ce cas, ce serait

a :: (Num a, Num b) => [(a, [b])]

...ce qui inclurait à la fois [(Int, [Int])] et [(Integer, [Integer])] . Cependant, la restriction de monomorphisme restreint le type par défaut, excluant un tel polymorphisme. GHC doit donc en choisir une version, et la version par défaut est Integer, pas Int.

La bonne solution, encore une fois, est de fournir une signature explicite. Cependant, vous pouvez également désactiver la restriction de monomorphisme :

{-# LANGUAGE NoMonomorphismRestriction #-}

type TestType = Int
a = [(1,[2,3])]

testFunc :: [(TestType ,[TestType])] -> TestType 
testFunc ((x,(y:z)):w) = x

main :: IO ()
main = print $ testFunc a

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X