такую функцию:
f :: String -> [Int]
f = map (\x -> (read x) :: Int)
Ошибка тут в read x нужно его поменять на read [x] ибо read принимает String а не Char.
Но ghc жалуется на саму функцию f:
• Couldn't match type ‘[Char]’ with ‘Char’
Expected: String -> [Int]
Actual: [String] -> [Int]
• In the expression: map (\ x -> (read x) :: Int)
In an equation for ‘f’: f = map (\ x -> (read x) :: Int)
Вопрос: тут есть два места где можно локализовать эту ошибку типов. Как ghс выбирает для какого места его показать?
Тут только одно место, где должна быть строка, а приходит Char. Не из чего выбирать :)
Но он же вроде жалуется не на Char != [Char], а на String != [String].
Одно другому не мешает. String = [Char], так что жаловаться на [Char] /= [[Char]] всё равно, что на Char /= [Char]. В ошибке ghc сначала указал, какие типы расходятся после всех сокращений, а потом уже указал это же противоречие, но в типе функции f.
Но он же мог вычислить тип необходимого аргумента для read и мог это показывать как ошибку. Разве не так?
компилятор пытается сопоставить все части требуемого и фактического типа, и ошибка не в read, а в сопоставлении, поэтому в сообщении именно отличающаяся часть
Обсуждают сегодня