如何访问列表中元组的元素?
例如
func :: [(Int, Int, Int)] -> Int
func (x:xs) --here I want to access c of every tuple (a,b,c)
答案 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]
-}
这是问题吗?