Как удобно работать с системой типов на Haskell?

Система типов в Haskell является мощной и любимой за ее математическую строгость и логическую обоснованность, с другой стороны, что-то столь же наивное, как показано ниже, заставляет меня задуматься, почему она не работает так, как ожидалось интуицией?

Например. почему не можетInt быть преобразованным вNum наx3 ноf1 приниматьInt против подписиNum?

Prelude> let x1 = 1
Prelude> :t x1
x1 :: Num a => a

Prelude> let x2 = 1 :: Int
Prelude> :t x2
x2 :: Int

Prelude> let x3 = (1 :: Int) :: Num a => a
Couldn't match expected type ‘a1’ with actual type ‘Int’

Prelude> let f1 :: Num a => a -> a; f1 = id
Prelude> :t f1 (1 :: Int)
f1 (1 :: Int) :: Int

Prelude> let f2 :: Int -> Int; f2 = id
Prelude> :t f2 1
f2 1 :: Int

Prelude> let f3 :: Num a => a -> Int; f3 = id

Prelude> let f4 :: Num a => Int -> a; f4 = id
Couldn't match type ‘a’ with ‘Int’

Я знал, что наконец-то нужно изучить основную теорию, например,Система типа HM удобно иметь дело с системой типов, и даже нашел некоторые хорошие записи, например,1, 2, 3 а также4 для демистификации этого. Что еще вы хотели бы порекомендовать, если вы когда-нибудь сталкивались и преодолели этот вызов?

@РЕДАКТИРОВАТЬ

Prelude> let f5 x5 = x5::Int
Prelude> :t f5
f5 :: Int -> Int

Prelude> let f6 x6 = x6::Num a => a
Couldn't match expected type ‘a1’ with actual type ‘t’

Первый,x6 должно быть, был супертипNum то естьNum сам когдаx6 тип помечен сNum, Тем не менее, конкатенация аннотации типа дляNum послеInt из(x6::Int)::Num a => a не будет объединено, если мы тогда удручаемx6 отNum вInt, Следовательно, первый предполагаемый типNum изx6 здесь недоволен.

Ответы на вопрос(1)

Ваш ответ на вопрос