获取列表中的元组元素

时间:2014-01-14 03:21:08

标签: haskell

如何访问列表中元组的元素?

例如

func :: [(Int, Int, Int)] -> Int
func (x:xs) --here I want to access c of every tuple (a,b,c)

3 个答案:

答案 0 :(得分:4)

您可以创建一个简单的函数来访问元组的第三个元素,然后使用map

thrd :: (a, b, c) -> c
thrd (a, b, c) = c

func :: [(Int, Int, Int)] -> [Int]
func xs = map thrd xs

这会给你一个包含每个元组的第三个元素的列表。不过,我不知道你想把它转换成单Int。你能详细说明你的用例吗?


要获得这些元素的平均值,您必须进行一些转换。您无法划分Int,因为Int不是定义Fractional的{​​{1}}类型类的实例。你可以写一个像

这样的平均函数
(/)

但这意味着您必须将average :: Fractional a => [a] -> a average xs = sum xs / fromIntegral (length xs) 中的每个元素转换为map thrd xs。为定义为

Fractional类型创建专门的平均函数会更有效
Int

这里的区别在于您首先对列表求和,然后将结果转换为averageInt :: Fractional a => [Int] -> a averageInt xs = fromIntegral (sum xs) / fromIntegral (length xs) 。您必须以任一方式执行求和,但无论列表大小如何,这都会将您必须执行的转换次数从列表中的元素数减少到1。

然后您可以将其用作

Fractional

由于averageThrd :: Fractional a => [(Int, Int, Int)] -> a averageThrd xs = averageInt $ map thrd xs Float都是Double的实例,因此您可以根据需要使用某些内联类型注释转换为其中任何一种类型:

Fractional

答案 1 :(得分:3)

请注意,您可以简单地嵌套模式匹配:

func :: [(Int, Int, Int)] -> Int
func ((a, b, c) : xs) = ... -- do something with c, and probably recurse on xs
func []               = ... -- don't forget the base case

答案 2 :(得分:1)

您可能会遇到转化问题。如果使用错误的平均值,则Int的平均值本质上是混乱的。您需要fromIntegral命令将Int转换为浮点型数字,如此...

f x = sAll / l
    where
        f3 (_,_,x) = x 
        sAll       = sum $ map (fromIntegral . f3) x 
        l          = fromIntegral $ length x 

{- 
[prompt] f [(1,2,3), (2,4,6)]
4.5
[prompt] 
-}

这是问题吗?