2014-09-11 2 views
0

Я очень новичок в программировании haskell и много раз испытываю трудности. Задача, которую я здесь задаю, состоит в том, что a имеет список чисел, которые он затем сравнивает с другим списком чисел, и возвращает три числа в качестве обратной связи, на основе которых может быть отфильтрована интерпретация других чисел. например.Объявление функций

[4,9], [7,9], [10,18], [2,9] является моим списком , теперь ему должно быть два отдельных списка [4,9] и [7,9], которые должны дать обратную связь (1,1,0)

первая функция должна проверить, имеют ли два списка одно и то же значение, если они есть, тогда оно должно возвращать значение 2, если есть только одно значение, тогда оно должно возвращать 1, без значений он возвращает 0 Я попытался сделать это с помощью метода elem, но im не смог добиться успеха. Таким образом, ответ для этого должен быть 1, поскольку в обоих списках он имеет 9.

Вторая функция проверяет минимальное значение. Он должен сравнивать только от второго элемента к первому. из того же примера выше [4,9] и [7,9] он сначала обнаруживает наименьшее значение в [7,9], которое равно 7, а затем проверяет любое значение ниже 7 в [4,9], оно там затем возвращается обратная связь 1 else его 0

Третья функция такая же, как и вторая, за исключением того, что она проверяет самое высокое значение например. [[3,13], [10,9], [5,7]] берем первые два элемента списка [3,13] и [10,9], теперь мы проверяем наибольшее число в [10, 9], который является 10 и проверить, что значение в [3,13] здесь ответ должен быть 1, так как 13 больше, чем 10 еще она 0

пожалуйста, помогите в объявлении этих функций бы очень обязан

+0

Это действительно не очень понятно, чего вы хотите достичь. Из того, что вы сказали, кажется, что вы хотя бы пытались что-то сделать. Можете ли вы опубликовать это и, возможно, попытаться переформулировать свой вопрос более конкретно? Я знаю, вы сказали, что то, что вы пробовали, не работает, но разве это не точка stackoverflow? – bheklilr

ответ

1

Ваш вопрос немного запутанный, не видя кода образца. Я думаю, что я понимаю, как ваша первая функция должна работать:

Кажется, что вы используете список списков [[Int]], но все ваши списки имеют только два элемента. Было бы проще использовать пару [(Int, Int)]

Тогда ваша первая функция может быть записана с вложенными если заявления:

firstTest (a1,b2) (a2,b2) = if a1 == a2 && b1 == b2 then 2 else if a1 == a2 || b1 == b2 then 1 else 0

Если он не может быть пара и должен быть списком списков, тогда было бы легче подтвердить вашу проблему и превратить эти два списка в Sets, используя Data.Set. Сравнение двух наборов гораздо более эффективно, чем сравнение двух списков - и Data.Set предоставляет нам полезную функцию isSubsetOf. Вы можете преобразовать список в набор, используя функцию fromList.

import qualified Data.Set as S 
firstTest' :: S.Set Int -> S.Set Int -> Int 
firstTest' sas sbs = if sas == sbs then 2 else if S.isSubsetOf sas sbs then 1 else 0 

Сравнение смежных элементов в списке несколько сложнее. Взгляните на мой ответ на этот вопрос: https://stackoverflow.com/a/25777940/3792504

Смежные вопросы