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!"