我正在寻找像
这样的东西class Indexed a e | a → e where
size :: a → Int
at :: a → Int → e
(可能使用Ix
)
然后,任何可索引结构都可以通过索引访问。
E.g。
instance Indexed T.Text Char where
size = T.length
at = T.index
instance Indexed [a] a where
size = length
at = (‼)
count :: (Eq e, Indexed a e) ⇒ a → e → Int
count a e = length $ filter (e≡) $ map (a `at`) [0…size a - 1]
然后
> count ("foo bar foo" :: T.Text) 'o'
4
> count ("foo bar foo" :: String) 'o'
4
但是(例如)Data.Text
和Data.ByteString
没有类似类的实例(或者我找不到)。