由于可以通过以下方式检查字符串是否在集合中:
import qualified Data.Set as S
S.member "examplestr"
我想知道是否有一个函数可以测试字符串是否是集合成员的前缀。例如,如果我想知道集合中是否有任何成员以字符串“ro”开头,如果集合中有字符串“roller”,该函数将返回 True。感谢您的回复
是的,因为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)
这是一个更快的 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
from的较短变体Data.Maybe
:
hasPrefix key = maybe False (isPrefixOf key) . S.lookupGE key