我正在编写一个函数,它可以在任意符号序列中进行一些搜索。我想让它足够通用,以便它可以在列表上运行,Foldable
以及ByteString
s and Text
s。将其概括为Foldable
很简单。但如何包含ByteString
s and Text
是?当然我可以转换ByteString
进入列表,然后调用我的函数,但我会失去所有优势ByteString
s.
举一个具体的例子,假设我们想要创建一个直方图函数:
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
也不能是文本Foldable
(它只存储Word8
s/Char
s,而不是任意元素),我坚持创建更多看起来像的函数exactly和之前的一样,只是类型签名不同:
histogramBS :: B.ByteString -> Histogram Word8
histogramBS = B.foldl (flip histogramStep) empty
histogramText :: T.Text -> Histogram Char
histogramText = T.foldl (flip histogramStep) empty
这是像 Haskell 这样的函数式语言所没有想到的。
如何使其通用,编写histogram
一劳永逸?
你的解决方案几乎就是ListLike包确实如此。还有附加包类似列表的实例它添加了实例Text
and Vector
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)