#haskell
#haskell
Вопрос:
Мне нужна функция, которая принимает список списков чисел и вычисляет максимум из каждого внутреннего списка, чтобы возвращать список чисел. Вот моя реализация:
f :: [[Int]]->[Int]
f x:xs = (maximum x) : f xs
Это приводит к ошибке синтаксического анализа:
h.hs:8:1: error: Parse error in pattern: f
|
8 | f x:xs = (maximum x) : f xs
Что не так с моим кодом? Как правильно реализовать такую функцию?
Комментарии:
1. Почему бы и нет
map maximum
?2. Тот факт, что в нем говорится об ошибке синтаксического анализа
f
токена, для меня загадочен, но правильное использование круглых скобок:f (x:xs)
заставляет это работать. (Ну, это происходит после того, как вы заменили неопределенноеas
на явно предназначенноеx
)3. @RobinZigmond Отзыв
p:q
является шаблоном всякий раз, когда естьp
иq
. Однако здесьp = f x
это недопустимый шаблон, поскольку в шаблонах вы не можете применять переменные типаf
. Я думаю, именно поэтому ошибка включенаf
.4. @Elmex80s Извините, это была ошибка.
Ответ №1:
В Haskell вы можете использовать оператор конструктора в качестве шаблона только тогда, когда он заключен в квадратные скобки:
f :: [[Int]] -> [Int]
f (x:xs) = (maximum as) : f xs
Комментарии:
1. Я исправил это, и теперь там написано «неиспользованный шаблон». Итак, я добавил f [[]]=[], но проблема сохраняется.
2. @TrevisLiu Использует
f [] = []
3. @4castle Но f принимает элементы типа [[Int]]? Итак, как это будет принимать []?
4.
[]
может иметь тип[[Int]]
. Все типы списков имеют[]
в качестве конструктора.5. @TrevisLiu, более конкретно,
[[]]
это список с одним элементом, и этот элемент является пустым списком. В то время как[]
вообще не имеет элементов