Я не знаю, что вы имеете в виду под «измерить» несоответствие между элементами списка, но если вы хотите, чтобы вычислить «большой» элемент в списке, вы будете использовать встроенный в maximum
функции:
maximum :: Ord a => [a] -> a
Эта функция принимает список значений, которые можно заказать, так что все числа, символы и строки, среди прочего.
Если вы хотите получить разницу между максимальным значением и минимальным значением, вы можете использовать аналогичную функцию minimum
, а затем просто вычесть два. Конечно, может быть немного более быстрое решение, в котором вы только проходите список один раз, или вы можете отсортировать список, а затем взять первый и последний элементы, но для большинства случаев делать diff xs = maximum xs - minimum xs
достаточно быстро и имеет смысл для кого-то другого.
Итак, вы хотите вычислить разницу между последовательными элементами, а не вычислять минимум и максимум каждого элемента. Вам не нужно индексировать напрямую, а использовать удобную функцию под названием zipWith
. Он берет двоичную операцию и два списка, и «застегивает» их вместе, используя эту двоичную операцию. Так что-то вроде
zipWith (+) [1, 2, 3] [4, 5, 6] = [1 + 4, 2 + 5, 3 + 6] = [5, 7, 9]
Это очень удобно, потому что, если один из списков заканчивается рано, он просто останавливается на достигнутом. Таким образом, вы могли бы сделать что-то вроде
diff xs = zipWith (-) xs ???
Но как мы компенсируем список на 1? Ну, простой (и безопасный) способ - использовать drop 1
.Вы можете использовать tail
, но это будет сгенерировано сообщение об ошибке и сбою программы, если xs
является пустой список, но drop
не
diff xs = zipWith (-) xs $ drop 1 xs
Так пример будет
diff [1, 2, 3, 4] = zipWith (-) [1, 2, 3, 4] $ drop 1 [1, 2, 3, 4]
= zipWith (-) [1, 2, 3, 4] [2, 3, 4]
= [1 - 2, 2 - 3, 3 - 4]
= [-1, -1, -1]
Эта функция возвращает положительные и отрицательные значения, и мы заинтересованы только в величине, поэтому мы можем использовать abs
функцию:
maxDiff xs = ??? $ map abs $ diff xs
И затем используя функцию, указанную выше:
maxDiff xs = maximum $ map abs $ diff xs
И все готово! Если вы хотите быть фантазии, вы могли бы даже написать в точке, свободной нотации
maxDiff = maximum . map abs . diff
Теперь, это будет на самом деле вызовет ошибку на пустой список, потому что maximum []
выдает ошибку, но я дам вам выяснить способ решения этого.
Вы хотите вернуть наибольшую разницу или самый большой элемент? –
Каким будет результат для списка, такого как '[2,0,5,2,7,7,5,6]'? –
Мне нужна самая большая разница между двумя соседями. Следовательно, результатом [2,0,5,2,7,7,5,6] будет 5-0 или 7-2 = 5. – Henry