Как мне объявить мой список 'test', чтобы он соответствовал типу testFunc?
Хорошо, объявив его как тип.
a :: [(TestType, [TestType])]
a = [(1,[2,3])]
Вообще говоря, вы всегда должны давать явные сигнатуры типов для таких определений верхнего уровня, как это.Без такой подписи компилятор выберет одну для вас.Обычно Haskell пытается выбрать наиболее общий доступный тип;в этом случае это будет
a :: (Num a, Num b) => [(a, [b])]
..., что будет включать в себя [(Int, [Int])]
и [(Integer, [Integer])]
.Однако ограничение мономорфизма ограничивает тип по умолчанию, исключая такой полиморфизм.Таким образом, GHC должен выбрать одну версию, и по умолчанию это Integer
, а не Int
.
Опять-таки, правильное решение - предоставить явную подпись.Однако вы также можете отключить ограничение мономорфизма:
{-# 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