返回元组元素的布尔值在元组列表中

时间:2016-03-10 17:13:33

标签: haskell boolean

如果给定True/False是元组列表的一部分,我试图返回String

我有一些代码可以做到这一点,但我确信这样做的方式要好得多。这是我的代码:

givenStringExists :: String -> [(String, Int)] -> Bool
givenStringExists u []  =   False
givenStringExists u (r:rs)
    |   u == fst(r)     =   True
    |   otherwise       =   givenStringExists u rs

有任何改善方法的建议吗?目前我不得不通过列表中的过滤器调用它(因此需要Bool),并希望能够在不必调用此函数的情况下进行调用。

3 个答案:

答案 0 :(得分:5)

这是一种简洁的方法

givenStringExists u theList = u `elem` map fst theList

答案 1 :(得分:2)

您不需要在括号中编写函数,因此您可以编写fst r

其次,您还可以在另一个模式匹配中进行模式匹配,如下所示:

...
givenStringExists u ((s,i):rs)
    |   u == s     =   True
...

第三,你也可以跳过守卫。通过延迟评估和||(或)的使用,这将只评估列表,直到找到一个给定的字符串:

givenStringExists u ((s,i):rs) = u==s || givenStringExists u rs

由于懒惰的影响,||会在左侧为True时停止,因为无论其他结果是什么,都是True。在&&中,同样的事情适用于查找False:如果左侧是False,则右侧无关紧要,因为整体表达式为{{ 1}}。

答案 2 :(得分:1)

这是jamshidh's answer上的另一个旋转,它将map fstelem结合在一起引人入胜。

import Data.Monoid (Any (..))
import Data.Foldable (Foldable (foldMap))

givenStringExists :: (Foldable f, Eq a)
                  => a -> f (a, b) -> Bool
givenStringExists a =
  getAny . foldMap (Any . (a ==) . fst)