所以我有一个元组列表:
[(1,2),(2,3),(3,4)]
例如,。我对其元素进行了计算。这个结果应该加入到这个元组中,但我不知道如何。
[(1,2,103),(2,3,809),(3,4,2034)]
是我想的格式。
答案 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)]
但我更喜欢列表理解: - )