我正在编写一个按照任意符号序列进行搜索的功能.我想让它足够通用,以便它可以在列表,Foldable以及ByteStrings和Texts上工作.将其概括为可折叠是简单的.但是如何包括字节串和文本?当然可以将ByteString转换成列表,然后调用我的函数,但是我将失去所有的优点ByteStrings.
有一个具体的例子,我们假设我们要做一个直方图函数:
import Control.Monad.State import qualified Data.Foldable as F import Data.Map.Strict (Map) import qualified Data.Map.Strict as Map import Data.Word import qualified Data.ByteString as B import qualified Data.Text as T type Histogram a = Map a Int empty :: (Ord a) => Histogram a empty = Map.empty histogramStep :: (Ord a) => a -> Histogram a -> Histogram a histogramStep k = Map.insertWith (+) k 1 histogram :: (Ord a,F.Foldable t) => t a -> Histogram a histogram = F.foldl (flip histogramStep) empty
但是既然ByteString和Text都不能被折叠(它只存储Word8s / Chars,而不是任意的元素),所以我不得不创建更多类似于之前的函数,只是使用不同的类型签名:
histogramBS :: B.ByteString -> Histogram Word8 histogramBS = B.foldl (flip histogramStep) empty histogramText :: T.Text -> Histogram Char histogramText = T.foldl (flip histogramStep) empty
这在Haskell这样的功能语言中并不期待.
如何使其通用,一次性直接写入直方图?