如何在monad函数链中将自己的数据类型定义为返回值?

时间:2011-06-28 08:29:18

标签: haskell

我开始玩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类型的数据类型。但仍可用于功能链。
任何人都可以给我一个提示吗?

1 个答案:

答案 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