2016-07-19 2 views
1

У меня есть список кортежей, как это:Как сравнить два кортежа в списке?

[(0.0,0.0),(1.0,0.0),(2.0,0.0),(3.0,0.0),(3.0,0.0),(3.0,0.0),(4.0,0.0),(4.0,0.0)] 

где первым элементом является X-координата и второй Y-координату, и теперь я хочу, чтобы написать функцию, которая будет возвращать:

[(0.0,0.0),(1.0,0.0),(2.0,0.0),(3.0,0.0),(3.0,1.0),(3.0,2.0),(4.0,0.0),(4.0,1.0)] 

Это берет первый элемент из первого кортежа и сначала из второго кортежа, а если он не равен, то Y не изменяется, но если они равны, мы добавляем один в Y.

если у кого-то есть идея, как писать в Haskell?

+0

Похоже, вы могли бы извлечь выгоду из функций, таких как 'groupBy' и со в' Data.List'. Взгляните на этот модуль, чтобы узнать, есть ли что-нибудь, что дает вам представление о том, как это решить. – bheklilr

+0

Я думал о лямбда и карте, но я понятия не имею, как совместить его с проверкой кортежей в списке – aabbcc

+0

Попробуйте написать небольшие функции, которые обрабатывают каждую часть вашего алгоритма. Например, напишите функцию, которая берет два кортежа и увеличивает второй элемент тогда и только тогда, когда первый элемент тот же. – pdexter

ответ

-1

Не тестировался, но что-то, как это будет делать:

foo :: [(Float, Float)] -> [(Float, Float)] 
foo [] = [] 
foo [x] = [x] 
foo ((xx, xy):(yx, yy):xs) = (xx, xy): theTuple : (foo ((yx, yy):xs)) 
    where 
     theTuple = if xx == yx then (yx, yy) else (yx, yy+1) 
Смежные вопросы