微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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软件包的功能.还有一个额外的包 listlike-instances,它添加了Text和Vector的实例.

原文地址:https://www.jb51.cc/html/224803.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐