haskell – 使单个功能在列表,ByteStrings和文本(以及其他类似的
发布时间:2020-12-14 18:56:12 所属栏目:资源 来源:网络整理
导读:我正在编写一个按照任意符号序列进行搜索的功能.我想让它足够通用,以便它可以在列表,Foldable以及ByteStrings和Texts上工作.将其概括为可折叠是简单的.但是如何包括字节串和文本?当然可以将ByteString转换成列表,然后调用我的函数,但是我将失去所有的优点By
我正在编写一个按照任意符号序列进行搜索的功能.我想让它足够通用,以便它可以在列表,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软件包的功能.还有一个额外的包
listlike-instances,它添加了Text和Vector的实例.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |