2016-12-22 10 views
1

私は実行しようとしている、かなり単純な機能に固執したハスケルのノブです。最終的に私の目標は、ByteStringを厳密に読むことです。デコーダでGetモナドを使用してByteStringから最初のWord32を取得し、特定の機能を実行します。Data.Bits.testBitWord32のさまざまな部分で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の理解は非常に限られています。私は実践のための簡単なユースケースを実装する前に、私がハスケルの暗い芸術のすべてを習得する必要がないことを望んでいました。答えが読書を続けることであれば、私はそれを受け入れます。

答えて

2

aのタイプはタプルで、最初のアイテムはEitherです。これにあなたのcase文を変更してみてください:

case a of 
    (Left val, _) -> SIO.putStrLn "Communist!" 
    (Right val, _) -> SIO.putStrLn $ "Fascist!" 
+0

すごいああ、私は精神的に括弧を除外。なぜそれは1つの項目のタプルを返すのですか?それは左か右のどちらかでしかありません。非常に直感的ではないようです。 –

+1

タプルには2つの項目があります。 2番目は 'ByteString'ですが、私は答えの下線を使って無視しました。 –

+0

ああ、今すぐ入手! Rightにはタプルが含まれています。デコードされたWord32とそれ以外のByteStringの部分は気にしません。ありがとうございました! –