Сначала, пожалуйста, запишите подписи типа, как
maximum :: Ord a => [a] -> a
облегчает процесс мышления о функциях.
так что в этом случае у нас есть функция, которая берет список сопоставимых вещей (Ord a => [a]
) и дает нам один - максимум из них.
maximum :: Ord a => [a] -> a
maximum [] = undefined
maximum [x] = x
maximum (x1 : x2 : xs)
| x1 > x2 = maximum (x1 : xs)
| otherwise = maximum (x2 : xs)
Во-вторых, назовите вещи так, чтобы другие не путались - я не знаю, что такое или может быть марадек, в хаскеле часто "список x
" обозначается xs
.
Теперь давайте проверим нашу maximum
-функцию:
> ghci maximum.hs
>>> maximum []
*** Exception: Prelude.maximum: empty list
>>> maximum [1..10]
10
>>> maximum [10,9..1]
10
>>> maximum "alpha,beta,gamma"
't'
>>> maximum [1.0,1.1..10.0]
10.000000000000053
работает все как положено: ошибка в пустом списке, максимум в целых числах и символах, а также только последний является неожиданным, поскольку это одна из странностей работы с числами с плавающей запятой и ошибками округления.
Редактировать
После комментария я неправильно понял вопрос опера (мне очень жаль!).
maximum2 :: Ord a => [a] -> (a,a)
maximum2 [] = undefined
maximum2 [x] = undefined
maximum2 [x1, x2] = (x1, x2)
maximum2 (x1 : x2 : x3 : xs)
| x2 > x1 = maximum2 (x2 : x1 : x3 : xs)
| x3 > x1 = maximum2 (x3 : x1 : xs)
| x3 > x2 = maximum2 (x1 : x3 : xs)
| otherwise = maximum2 (x1 : x2 : xs)
надеюсь, вот ожидаемое решение.
> ghci maximum.hs
>>> maximum []
*** Exception: Prelude.maximum: empty list
>>> maximum2 [1..10]
(10,9)
>>> maximum2 [10,9..1]
(10,9)
>>> maximum2 [9,19,10,23]
(23,19)
>>> maximum "alpha,beta,gamma"
('t','p')
>>> maximum [1.0,1.1..10.0]
(10.000000000000053,9.900000000000052)
>>> maximum2 (10:[1..10])
(10,10)
Я не знаю, соответствует ли последний результат ожидаемому или должен быть (10,9)
.