Функция кортежа списков - PullRequest
0 голосов
/ 19 сентября 2018

Извините, если этот вопрос очень тривиален, но я довольно долго пытался найти на него ответ, поэтому решил разместить его здесь.

Я хочу создать функцию, которая принимает список двоичных кортежей: [(Integer, Integer)] и выводит максимальное целое число из всех вторых целых чисел из всех кортежей.Я написал следующий код:

maxSecond:: [(Integer,Integer)] -> Integer
maxSecond [(ks, as)] = aux (unzip [(ks, as)])
  where aux ([ks],[as]) = maximum ([as])

Но это работает, только если я ввожу список только из 1 кортежа и выдает ошибку «Неисчерпывающие шаблоны в функции» для списка из более чем 2 кортежей.Мой вопрос не столько в том, как на самом деле решить исходную проблему, сколько в том, почему такой подход не работает в Haskell?

Я также написал следующую функцию:

aaa:: ([Integer], [Integer]) -> Integer
aaa ([as],[ms]) = 10

Ипо-видимому, невозможно ввести кортеж списков в Haskell (если только списки не состоят из 1 элемента).Есть ли какое-либо объяснение этому?

Спасибо !!

1 Ответ

0 голосов
/ 19 сентября 2018

Обычная ошибка, которую допускают начинающие программисты на Haskell, заключается в том, что они думают, что [x] - это шаблон, который соответствует списку любой длины.Но [x] на самом деле является шаблоном, который соответствует списку singleton (список с ровно одним элементом, и этот элемент "связан" с x).

Если мы хотим иметь возможность обрабатывать пустые списки ([]) или непустые списки (с длиной больше нуля), мы можем просто написать как шаблон x, x будет, чем получить "связаны«к самому списку.Обратите внимание, что мы можем использовать любой идентификатор, который мы хотим.Сопоставление с образцом для списков, конечно, полезно: например, для обработки пустого списка, минусов, списка, содержащего ровно один, два, три, пять и т. Д. Элементов.Но здесь мы только ограничимся и усложним ситуацию.

Чтобы вычислить максимум второго элемента кортежей, мы можем обработать его, сначала сделав пинг map, который генерирует списокэлементов, каждый второй элемент соответствующего кортежа, и затем мы можем вычислить maximum этого списка, например:

maxSecond :: Ord a => [(a, a)] -> a
maxSecond xs = maximum (map snd xs)

Мы здесь, таким образом, используем map :: (a -> b) -> [a] -> [b] функция для применения функции ко всем элементам в списке xs, это функция snd :: (c, d) -> d, которая, таким образом, принимает второй элемент 2-tuple, а затем мы вычисляем maximum :: Ord e => [e] -> e, чтобы получить максимум из этого списка.

Мы также можем использовать (.) :: (b -> c) -> (a -> b) -> a -> c оператор, и напишите это как:

maxSecond :: Ord a => [(a, a)] -> a
maxSecond = maximum . map snd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...