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