Я изучаю Haskell, используя книгу " Haskell Programming from First Principles", и в конце главы 4, "Основные типы данных", Я столкнулся с чем-то, что смутило меня. В книге упоминается функция length
и говорится, что она работает на Lists
s. Все в порядке с этим, но когда я пытаюсь использовать эту функцию length
с различными Tuple
s, то, что я вижу, смущает меня:
Сначала посмотрим тип length
:
:t length
length :: Foldable t => t a -> Int
ОК, поэтому я прочитал выше как "берет Складную, которая, по моему мнению, является списком для удобства, и возвращает Int, то есть количество элементов в списке". Отсюда моя первая путаница: зачем вообще работает следующая работа:
length (1, 1)
1
Потому что мне кажется, что я только что передал кортеж с двумя элементами в length
, и он вернул 1. Является ли кортеж списком? Является ли кортеж Складным? И, конечно, почему 1
?
Теперь я делаю еще один шаг:
length (1, 1, 1)
<interactive>:6:1:
No instance for (Foldable ((,,) t0 t1))
arising from a use of ‘length’
In the expression: length (1, 1, 1)
In an equation for ‘it’: it = length (1, 1, 1)
<interactive>:6:9:
No instance for (Num t0) arising from the literal ‘1’
The type variable ‘t0’ is ambiguous
Note: there are several potential instances:
instance Num Integer -- Defined in ‘GHC.Num’
instance Num Double -- Defined in ‘GHC.Float’
instance Num Float -- Defined in ‘GHC.Float’
...plus two others
In the expression: 1
In the first argument of ‘length’, namely ‘(1, 1, 1)’
In the expression: length (1, 1, 1)
<interactive>:6:12:
No instance for (Num t1) arising from the literal ‘1’
The type variable ‘t1’ is ambiguous
Note: there are several potential instances:
instance Num Integer -- Defined in ‘GHC.Num’
instance Num Double -- Defined in ‘GHC.Float’
instance Num Float -- Defined in ‘GHC.Float’
...plus two others
In the expression: 1
In the first argument of ‘length’, namely ‘(1, 1, 1)’
In the expression: length (1, 1, 1)
Еще одна попытка:
length (1::Int, 1::Int, 1::Int)
<interactive>:7:1:
No instance for (Foldable ((,,) Int Int))
arising from a use of ‘length’
In the expression: length (1 :: Int, 1 :: Int, 1 :: Int)
In an equation for ‘it’: it = length (1 :: Int, 1 :: Int, 1 :: Int)
Но следующие работы:
length (1::Int, 1::Int)
1
Есть ли хорошее объяснение поведения, которое я наблюдаю выше? Я неправильно читаю тип length
? Или что-то происходит за кулисами?