haskell – 使单个功能在列表,ByteStrings和文本(以及其他类似的表示)上工作,

前端之家收集整理的这篇文章主要介绍了haskell – 使单个功能在列表,ByteStrings和文本(以及其他类似的表示)上工作,前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在编写一个按照任意符号序列进行搜索功能.我想让它足够通用,以便它可以在列表,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这样的功能语言中并不期待.

如何使其通用,一次性直接写入直方图?

解决方法

您的解决方案几乎是 ListLike软件包的功能.还有一个额外的包 @L_502_1@,它添加了Text和Vector的实例.

猜你在找的HTML相关文章