由于可以通过以下方式检查字符串是否在集合中:
import qualified Data.Set as S
S.member "examplestr"
我想知道是否有一个函数可以测试字符串是否是该集合成员的前缀。例如,如果我想知道集合中的任何成员是否以字符串“ro”开头,则如果集合中存在字符串“roller”,则该函数将返回True。 感谢您的回复
答案 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