我开始玩haskell,我想编写一个二进制数据解析器,我已经用我迄今为止尝试的所有编程语言编写了。
但我正在努力解决monad概念和haskell中数据的一般处理问题。 到目前为止,我有以下内容:
data TestData = T { value :: String } deriving (Show)
data TestData2 = T2 { value2 :: String } deriving (Show)
testFunc :: Handle -> IO BS.ByteString
testFunc hs = BS.hGet hs 4
main = do
handle <- SIO.openFile "c:/temp/test.bin" SIO.ReadMode
contents1 <- BS.hGet handle 4
contents2 <- testFunc handle
contents3 <- BS.hGet handle 4
putStrLn (show (T (bytesToString contents1)))
putStrLn (show (T (bytesToString contents2)))
putStrLn (show (T (bytesToString contents3)))
我想要读取的数据是多个嵌套结构(说出来自C)
所以我想知道的是如何编写我的testFunc
它将返回我自己的TestData2类型的数据类型。但仍可用于功能链。
任何人都可以给我一个提示吗?
答案 0 :(得分:2)
您可以使用符号表示这样做:
testFunc :: Handle -> IO TestData2
testFunc hs = do contents <- BS.hGet hs 4
return $ T2 (bytesToString contents)
或者你可以使用Control.Applicative:
中的<$>
这样做
testFunc :: Handle -> IO TestData2
testFunc hs = T2 . bytesToString <$> BS.hGet hs 4