Haskell получает значение Either от Get monad

Я - новичок из Haskell, застрявший на довольно простой функции, которую я пытаюсь выполнить. В конечном итоге моя цель - прочитать строгое ByteString, использовать Get монада с декодером для извлечения первого Word32 от ByteStringи выполнять конкретные функции, где Data.Bits.testBit оценивается как True в различных частях Word32,

Вот мой пример кода:

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 в основном я вижу, что он возвращает экземпляр Either, например, так:

(Right 1499024717,"DDhhmmss")

Когда я пытаюсь выполнить выбор слева или справа, происходит сбой со следующей ошибкой:

HSStackruExamp.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 это здесь. У меня все еще очень ограниченное понимание Монад и Трансформаторов Монад. Я надеялся, что мне не нужно осваивать каждое из темных искусств Хаскелла, прежде чем я смогу реализовать на практике даже простые варианты использования. Если ответ будет продолжать читать, то я принимаю это.

1 ответ

Решение

Тип a является кортеж, где первый элемент Either, Попробуйте изменить свое утверждение к этому:

case a of
    (Left val, _) -> SIO.putStrLn "Communist!"
    (Right val, _) -> SIO.putStrLn $ "Fascist!"
Другие вопросы по тегам