Как удобно работать с системой типов на 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
здесь недоволен.