1

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

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

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

4

2 回答 2

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)
于 2013-10-13T13:09:55.030 回答
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

这是使用maybefrom的较短变体Data.Maybe

hasPrefix key = maybe False (isPrefixOf key) . S.lookupGE key
于 2013-10-13T16:55:13.953 回答