Haskell:找出Data.Set中的元素是否以字符串开头?

时间:2013-10-13 13:04:09

标签: haskell set

由于可以通过以下方式检查字符串是否在集合中:

import qualified Data.Set as S
S.member "examplestr"

我想知道是否有一个函数可以测试字符串是否是该集合成员的前缀。例如,如果我想知道集合中的任何成员是否以字符串“ro”开头,则如果集合中存在字符串“roller”,则该函数将返回True。 感谢您的回复

2 个答案:

答案 0 :(得分:6)

是的,自type String = [Char]以来,我们可以使用isPrefixOf

anyStartsWith :: Eq a => [a] -> Set [a] -> Bool
anyStartsWith str set =  not . S.empty $ S.filter (isPrefixOf str) set

或者,因为Set可折叠,

 import qualified Data.Foldable as F
 anyStartsWith str = F.any (isPrefixOf str)

答案 1 :(得分:2)

这是一个更快的O(log(N))解决方案:

import qualified Data.Set as S
import Data.List

s = S.fromList [ "fowl", "foo", "foobar", "goo" ]

hasPrefix key s = case S.lookupGE key s of
        Nothing -> False
        Just p -> key `isPrefixOf` p

以下是使用maybe中的Data.Maybe的较短变体:

hasPrefix key = maybe False (isPrefixOf key) . S.lookupGE key