如果给定True/False
是元组列表的一部分,我试图返回String
。
我有一些代码可以做到这一点,但我确信这样做的方式要好得多。这是我的代码:
givenStringExists :: String -> [(String, Int)] -> Bool
givenStringExists u [] = False
givenStringExists u (r:rs)
| u == fst(r) = True
| otherwise = givenStringExists u rs
有任何改善方法的建议吗?目前我不得不通过列表中的过滤器调用它(因此需要Bool
),并希望能够在不必调用此函数的情况下进行调用。
答案 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 fst
与elem
结合在一起引人入胜。
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)