Haskell在过滤列表列表时访问子列表

时间:2017-09-19 12:40:17

标签: haskell

我对Haskell很新,并尝试完成以下任务:

findGood :: [String] -> String -> [String] -> String -> Bool

我将这些名称替换为其类型,以便于阅读。问题是我不能做subList,但是(!!)将列表作为参数。那我怎么写这个呢?

编辑:

我单独编写过滤条件,这有效,但问题仍然是相同的:

findGood :: String -> [String] -> String -> [String] -> Bool
            filter (findGood a b c) [[String]]

但是我仍然需要填写所有值,尽管第一个[String]是子列表。可以输入所有其他值..

编辑:

我解决了它,我需要做的是把[String]放在最后,然后我可以把它留在过滤器中

所以

{{1}}

这是有效的,这就是我想要的。 (不需要D)

1 个答案:

答案 0 :(得分:1)

鉴于您想要比较资金并检查money > 500,将其存储为Int而不是String会更有意义。此外,我会说将每个条目存储为元组并且具有元组列表比使用列表列表更有意义(这也是Int实现金钱所必需的,因为您可以拥有不同类型的列表列表)。

因此表格的类型为[(String, Int)]

filter遍历列表并根据条件检查每个元素。在这种情况下,条件非常简单,我不会费心去做它自己的功能(除非你需要在很多地方重复使用它)。

当给出一对(String, Int)类型时,我们只想检查第二个值是否为> 500.所以条件只是snd row > 500,其中row是我们给出的表示表中一行的元组。

这让我们: filter (\row -> snd row > 500) table

[("Geoff", 600), ("Bill", 700), ("Bill Jr.", 10)]进行测试,可以按预期进行[("Geoff", 600), ("Bill", 700)]