gpt4 book ai didi

haskell - 使单个函数适用于列表、字节字符串和文本(也许还有其他类似的表示形式)

转载 作者:行者123 更新时间:2023-12-02 06:58:21 24 4
gpt4 key购买 nike

我正在编写一个函数,它可以在任意符号序列中进行一些搜索。我想让它足够通用,以便它可以在列表、Foldable 以及 ByteString 和 Text 上工作。将其推广到 Foldable 很简单。但是如何包含 ByteStringText 呢?当然,我可以将 ByteString 转换为列表,然后调用我的函数,但我会失去 ByteString 的所有优势。

举一个具体的例子,假设我们想要创建一个直方图函数:

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 都不能Foldable(它只存储 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它添加了 TextVector 的实例。

关于haskell - 使单个函数适用于列表、字节字符串和文本(也许还有其他类似的表示形式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12857615/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com