将2元组转换为3元组Haskell

时间:2014-04-09 11:06:31

标签: haskell tuples

所以我有一个元组列表:

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

。我对其元素进行了计算。这个结果应该加入到这个元组中,但我不知道如何。

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

是我想的格式。

4 个答案:

答案 0 :(得分: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))

答案 1 :(得分: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])]

答案 2 :(得分:5)

使用map功能:

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

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

答案 3 :(得分: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

或者将列表用作monad:

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

但我更喜欢列表理解: - )