Haskell 缺少结果类型?函数中的长度::Monad m=>;通过测试环m r->;m(国际货币基金组织)
我有一个简单的函数,每次读取一个字节的二进制文件。它得到一个编译时错误,如下所示。问题似乎在于的结果ByTestString的bs2有一个未知类型。我是否缺少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
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
类型有两个类型参数。第一个是基本monadm
,在其中生成值(通常是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