在Haskell中获取元组列表的第一个元组

时间:2015-11-15 23:26:04

标签: algorithm haskell

我试图使用以下内容为列表中的每个元组获取元组的第一个元素:

getRow :: [(Integer,Integer)] -> [(Integer,Integer)]
getRow (row:rows) = do
    (fst(head (row)))

我想如果我能得到元组列表中每个元首的第一个元素,那么它将只返回第一个元素,但事实并非如此。

1 个答案:

答案 0 :(得分:1)

根据您的描述,您的预期输出应该是元素列表,而不是元组列表。因此,第一步是将签名更改为:

getRow :: [(Integer,Integer)] -> [Integer]

但是,当该方法适用于任何类型时,为什么限制为Integer?通过这样做,让我们更加通用:

getRow :: [(a,b)] -> [a]

现在算法本身。您对使用fst获取第一个元素有正确的想法。我们将使用此函数以及列表推导来完成以下工作:

getRow lst = [fst x | x <- lst]

这将遍历列表,从每个元组中提取第一个元素并返回提取元素的列表。总而言之,我们得到了这个:

getRow :: [(a,b)] -> [a]
getRow lst = [fst x | x <- lst] 

Demo

当然,这是解决问题的众多可行方法之一。另一种解决方案是使用foldr函数来执行相同的操作,如下所示:

getRow2 :: [(a,b)] -> [a]
getRow2 lst = foldr (\x acc -> (fst x):acc) [] lst

您可以从一个好的教程开始学习Haskell的基础知识,并使用Hackage作为参考。但是,@ Eric绝对正确地说,在任何范例中,您需要在开始编写代码之前先弄清楚步骤。