私は実行しようとしている、かなり単純な機能に固執したハスケルのノブです。最終的に私の目標は、ByteString
を厳密に読むことです。デコーダでGet
モナドを使用してByteString
から最初のWord32
を取得し、特定の機能を実行します。Data.Bits.testBit
がWord32
のさまざまな部分でTrueと評価されます。ここでハスケルの価値を取得するどちらかからモナドを取得
は私のサンプルコードです:
import Data.List
import Data.Char
import Data.Function
import System.Random
import Data.Bits
import Data.Either
import Data.Binary.Strict.Get
import System.IO as SIO
import Data.ByteString.Char8 as B
import Data.Word (Word32)
import Data.ByteString.UTF8 as BU
dateTemplate = "YYMMDDhhmmss"
convertFromString :: String -> ByteString
convertFromString s = BU.fromString s
mahDecoder :: Get Word32
mahDecoder = do
first32Bits <- getWord32be
return first32Bits
main :: IO()
main = do
let a = runGet mahDecoder (convertFromString dateTemplate)
SIO.putStrLn $ show a
-- When I uncomment these lines I get the problem
--case a of
-- Left val -> SIO.putStrLn "Communist!"
-- Right val -> SIO.putStrLn $ "Fascist!"
私はデコーダにrunGet
機能を実行し、メインの私のByteString
を渡すとき、私はそれはそうのようないずれかのインスタンスを返します見ることができます:
(Right 1499024717,"DDhhmmss")
左または右で大文字と小文字を区別しようとすると、次のエラーで失敗します。
HSStackOverflowExamp.hs:31:5:
Couldn't match expected type `(Either String Word32, ByteString)'
with actual type `Either t0 t1'
In the pattern: Left val
In a case alternative: Left val -> SIO.putStrLn "Communist!"
In a stmt of a 'do' block:
case a of {
Left val -> SIO.putStrLn "Communist!"
Right val -> SIO.putStrLn $ "Fascist!" }
私がここで間違っていることは何ですか?私は、デコーダでByteStringからすべてのバイトを読み込むようになっているような気分になります。正直言って、a
のタイプが何であるかは完全にはわかりません。私はまだMonadsとMonad Transformersの理解は非常に限られています。私は実践のための簡単なユースケースを実装する前に、私がハスケルの暗い芸術のすべてを習得する必要がないことを望んでいました。答えが読書を続けることであれば、私はそれを受け入れます。
すごいああ、私は精神的に括弧を除外。なぜそれは1つの項目のタプルを返すのですか?それは左か右のどちらかでしかありません。非常に直感的ではないようです。 –
タプルには2つの項目があります。 2番目は 'ByteString'ですが、私は答えの下線を使って無視しました。 –
ああ、今すぐ入手! Rightにはタプルが含まれています。デコードされたWord32とそれ以外のByteStringの部分は気にしません。ありがとうございました! –