2014-04-09 2 views
1

Поэтому у меня есть список кортежей:Преобразование 2-кортеж 3-кортеж Haskell

[(1,2),(2,3),(3,4)] 

, например. И я выполняю расчет по его элементам. Результат этого должен быть присоединен к этому кортежу, но я не знаю, как это сделать.

[(1,2,103),(2,3,809),(3,4,2034)] 

- формат, о котором я думаю.

ответ

8

Предполагая, что у вас есть функция вычисления, как:

calculate :: Int -> Int -> Int 

вы можете сделать

calculateAll :: [(Int, Int)] -> [(Int, Int, Int)] 
calculateAll = map (\(x, y) -> (x, y, calculate x y)) 

или более общо:

calculateAllWith :: (a -> b -> c) -> [(a, b)] -> [(a, b, c)] 
calculateAllWith f = map (\(x, y) -> (x, y, f x y)) 
+0

Почему лямбды? Почему бы просто не использовать 'calculateAll = map calculate' и' calculateAllWith f = map f'? – mhwombat

+0

@mhwombat, потому что 'calculate' или' f' имеют тип 'a -> b -> c', а не' (a, b) -> (a, b, c) '. –

+0

Принимая этот ответ, потому что правильная подпись используется для функции 'calculate', и она работает так, как есть. Благодарю. –

5

Используйте map функцию:

calc :: (Int, Int) -> (Int, Int, Int) 
calc = error "Implement me" 

calcList :: [(Int, Int)] -> [(Int, Int, Int)] 
calcList = map calc 
+0

Я думаю, что это решение является наиболее простым. Если вы не знакомы с точечной нотацией, эта последняя строка эквивалентна 'calcList xs = map calc xs' – mhwombat

+0

Да, я это понял. Спасибо за ответы. –

6

Довольно простое решение:

import Control.Applicative ((<*>)) 

mapResultOn3rd :: (a -> b -> c) -> [(a,b)] -> [(a,b,c)] 
mapResultOn3rd f = map (uncurry (,,) <*> uncurry f) 

Например, в GHCI:

>>> mapResultOn3rd (:) [(1,[2]), (3,[4,5])] 
[(1,[2],[1,2]),(3,[4,5],[3,4,5])] 
5

Вы также можете использовать список понимание в GHCi:

Prelude> let list = [(1,2),(2,3),(3,4)] 
Prelude> [(x,y,x*y) | (x,y) <- list] 
[(1,2,2),(2,3,6),(3,4,12)] 

http://www.haskell.org/haskellwiki/List_comprehension

Или используйте Список как монада:

Prelude> do (x,y) <- list; return (x,y,x*y) 
[(1,2,2),(2,3,6),(3,4,12)] 

Но я предпочитаю список понимание :-)

+1

Кстати, я так и сделал. –

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