haskell - 独自のデータ型をモナド関数チェーンの戻り値として定義する方法は?

haskell

私はhaskellをいじり始め、これまでに試したすべてのプログラミング言語ですでに行ったバイナリデータのパーサーを作成したいと考えています。

しかし、私はモナドの概念と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)))


私が読みたいデータは複数のネストされた構造体です(i Cで話されています)。
だから私が知りたいのは、自分のTestData2型のデータ型を返すようにtestFuncを記述する方法です。ただし、関数のdoチェーンで引き続き使用できます。
誰でも私にヒントを与えることができますか?
答え
あなたはdo記法を使ってこのようにすることができます:

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
関連記事

haskell - 型クラスによる関数型シグネチャのクリーンアップ

haskell - Haskellの可変ヒープ構造

haskell - Yesodがインストールに失敗する(つまり、テキストパッケージ)

haskell - wxHaskellのラベルが全文を表示できない

haskell - Haskellでのリストの結合

string - Haskellのグリッドからローカルスクエアを返す

haskell - ネットワークパッケージをインストールできません

performance - 素数フィルタの2つの実装のパフォーマンス比較

haskell - Yorgeyらの「unbound」ライブラリを最新のGHC / Haskellプラットフォームにインストールできない

haskell - Showクラスにあるという事実を使用せずに関数を定義する