Haskell 缺少结果类型?函数中的长度::Monad m=>;通过测试环m r->;m(国际货币基金组织)

Haskell 缺少结果类型?函数中的长度::Monad m=>;通过测试环m r->;m(国际货币基金组织),haskell,haskell-streaming,Haskell,Haskell Streaming,我有一个简单的函数,每次读取一个字节的二进制文件。它得到一个编译时错误,如下所示。问题似乎在于的结果ByTestString的bs2有一个未知类型。我是否缺少r上的类型约束 import qualified Data.ByteString.Streaming.Char8 as BSSC main :: IO () main = runResourceT $ dump $ BSSC.readFile "filename" dump :: (MonadIO m) => BSSC.ByteS

我有一个简单的函数,每次读取一个字节的二进制文件。它得到一个编译时错误,如下所示。问题似乎在于的结果ByTestString的bs2有一个未知类型。我是否缺少
r
上的类型约束

import qualified Data.ByteString.Streaming.Char8 as BSSC

main :: IO ()
main = runResourceT $ dump $ BSSC.readFile "filename"

dump :: (MonadIO m) => BSSC.ByteString m r -> m ()                                                                                                                                                
dump bs = do
    len :> bs2 <- BSSC.length bs          -- Data.Functor.Of (:>)
    if len <= 1 then return ()
    else dump $ BSSC.putStr $ BSSC.splitAt 1 bs2

您可以使用
bs
作为
splitAt

import qualified Data.ByteString.Streaming.Char8 as BSSC

main :: IO ()
main = runResourceT $ dump $ BSSC.readFile "filename"

dump :: (MonadIO m) => BSSC.ByteString m r -> m ()                                                                                                                                                
dump bs = do
    len :> bs2 <- BSSC.length bs
    if len <= 1 then return ()
    else dump $ BSSC.putStr $ BSSC.splitAt 1 bs
将合格数据.ByteString.Streaming.Char8导入为BSSC
main::IO()
main=runResourceT$dump$BSSC.readFile“filename”
dump::(MonadIO m)=>BSSC.ByteString m r->m()
转储bs=do

len:>bs2来自streamingbytestring的
ByteString
类型有两个类型参数。第一个是基本monad
m
,在其中生成值(通常是
IO

第二个是一个特殊的结束值
r
,当
ByteString
耗尽时返回。通常它是一个非信息性的
()
。但是,它对于定义函数非常有用,例如
splitAt::Monad m=>Int64->ByteString m r->ByteString m(ByteString m r)
。该类型的意思是:“给我一个限制位置和一个有效的字节流,该字节流返回
r
,我将给你另一个不超过限制的字节流,并返回一个有效的字节流,该字节流返回
r
”嵌套在外部流中的此结束流只有在外部流耗尽后才能到达


length
具有类型
Monad m=>ByteString mr->m(Of Int r)
。它使用它作为参数接收的值流,并在基本monad中返回一个动作。
ByteString
不再存在。传递给
splitAt
bs2
不是
ByteString
而是原始
ByteString
的结束值,其类型为
r
。这会导致一个类型错误。

您的问题是,在
len:>bs2中,如果要递归处理字符串,必须使用
uncon
获取头和尾,并使用尾执行递归调用。
import qualified Data.ByteString.Streaming.Char8 as BSSC

main :: IO ()
main = runResourceT $ dump $ BSSC.readFile "filename"

dump :: (MonadIO m) => BSSC.ByteString m r -> m ()                                                                                                                                                
dump bs = do
    len :> bs2 <- BSSC.length bs
    if len <= 1 then return ()
    else dump $ BSSC.putStr $ BSSC.splitAt 1 bs
import qualified Data.ByteString.Streaming.Char8 as BSSC

main :: IO ()
main = runResourceT $ dump $ BSSC.readFile "filename"

dump :: (MonadIO m) => BSSC.ByteString m r -> m ()                                                                                                                                                
dump bs = do
    split <- BSSC.uncons bs
    case split of
       Left _        -> return ()
       Right (x, xs) -> putStr (show x) >> dump xs