Макс алгоритм haskell - PullRequest
       4

Макс алгоритм haskell

2 голосов
/ 03 декабря 2011

В следующем алгоритме есть некоторые ошибки, я не знаю, как это исправить, я пытаюсь, но я не могу это исправить.

Этот алгоритм возвращает 1-е и 2-е максимальное значение из списка.

Спасибо за помощь.

maxmimum [] = []  
maxmimum [head] = [head] 
maxmimum [head1 : head2 : maradek] 
  | head1 > head2 = maxmimum2 maradek head1 head2 
  | otherwise = maxmimum2 maradek head2 head1

--maxmimum2 :: [Int] Int Int -> [Int]

maxmimum2 [] head1 head2 = [head1, head2] 
maxmimum2 [head : maradek] head1 head2    
  | head > head1 = maxmimum2 maradek head head1
  | head > head2 = maxmimum2 maradek head1 head
  | otherwise = maxmimum2 maradek head1 head2

Ошибка разбора в шаблоне: maxmimum

Ответы [ 3 ]

6 голосов
/ 03 декабря 2011

Во-первых, вы, вероятно, хотите дать явные сигнатуры типов, потому что это не говорит о том, что вы думаете, что говорит.

maxmimum [head1 : head2 : maradek] 

Это говорит о том, что у вас есть список списков. Внешний список имеет один элемент, который сам по себе является списком длиной не менее двух. Тип [[a]]. Я ожидаю, что вы хотите maximum (head1 : head2 : restOfList) = ....

Та же проблема появляется в maximum2 ([head : maradek] должно быть (head : maradek)). Подпись типа, которую вы прокомментировали для Maximum2, почти правильная (после того, как вы воспользуетесь этим исправлением), вам просто нужно добавить стрелки (функция каррируется): maximum2 :: [Int] -> Int -> Int -> [Int].

2 голосов
/ 04 декабря 2011

Сначала, пожалуйста, запишите подписи типа, как

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).

1 голос
/ 03 декабря 2011
(reverse $ sort [1, 6, 2, 7 ,8]) !! 0
(reverse $ sort [1, 6, 2, 7 ,8]) !! 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...