этот код выдает ту же ошибку, что и вы:
test :: Int
test =
(res :: Num a => a)
where
res = 5
Компилятор понял, что res
всегда относится к типу Int
и обеспокоен тем, что по какой-то причине вы думаете, res
полиморфен.
этот код, однако, работает нормально:
test :: Int
test =
res
where
res :: Num a => a
res = 5
и здесь res
определяется как полиморфный, но используется только как Int
. компилятор беспокоится только тогда, когда вы так печатаете вложенные выражения. в этом случае res
можно использовать повторно, и, возможно, одно из этих применений не будет использовать его как Int
, в отличие от ввода вложенного выражения, которое само по себе не может использоваться повторно.