сопоставление шаблонов в списке списков в haskell

#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, более конкретно, [[]] это список с одним элементом, и этот элемент является пустым списком. В то время как [] вообще не имеет элементов