【发布时间】:2018-12-04 13:12:07
【问题描述】:
我想写一个函数
countDigits :: Text -> Either Text (Map Int Int)
构建数字字符的直方图,如果有非数字字符并带有指示第一个或所有非数字字符的消息,则会失败。如果这是 String 我可以写类似的东西
countDigits = fmap frequencies . mapM toDigit
where
frequencies :: Ord a => [a] -> Map a Int
frequencies = M.fromListWith (+) . (`zip` [0..9])
toDigit :: Char -> Either String Int
toDigit c = readEither [c] <> Left ("Invalid digit " ++ show c)
但由于Data.Text 不是Foldable,我不能使用mapM。
事实上,将Data.Text 值转换为任何惰性流值似乎有点困难。 (folds of Data.Text.Strict 都是热切的和非单子的,Data.Text.Lazy 已被警告不要。这是拔出conduit 或pipes 的地方吗?
【问题讨论】:
-
您的
frequencies看起来也不正确:它不是总是返回M.empty吗?我想你想要更像M.insertWith。 -
我不知道
Data.Text.Lazy有什么固有的错误。将其用于惰性 I/O 会导致与其他惰性 I/O 相同的一般问题,但仅将其用作数据结构应该没有问题。
标签: haskell monads lazy-sequences