我试图使用以下内容为列表中的每个元组获取元组的第一个元素:
getRow :: [(Integer,Integer)] -> [(Integer,Integer)]
getRow (row:rows) = do
(fst(head (row)))
我想如果我能得到元组列表中每个元首的第一个元素,那么它将只返回第一个元素,但事实并非如此。
答案 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]
当然,这是解决问题的众多可行方法之一。另一种解决方案是使用foldr
函数来执行相同的操作,如下所示:
getRow2 :: [(a,b)] -> [a]
getRow2 lst = foldr (\x acc -> (fst x):acc) [] lst
您可以从一个好的教程开始学习Haskell的基础知识,并使用Hackage作为参考。但是,@ Eric绝对正确地说,在任何范例中,您需要在开始编写代码之前先弄清楚步骤。