Я чувствую, что Haskell noob застрял на довольно простой функции, которую я пытаюсь выполнить. В конечном счете, моя цель - прочитать строгий ByteString
, использовать монаду Get
с декодером для извлечения первого Word32
из ByteString
и выполнять определенные функции, где Data.Bits.testBit
оценивает значение True на разных частях Word32
.Haskell получает значение Либо от Get monad
Вот мой пример кода:
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. Я надеялся, что мне не нужно овладеть каждым из темных искусств Хаскелла, прежде чем я смогу реализовать даже простые практические примеры. Если ответ должен продолжать читать, я принимаю это.
Ого, я мысленно отфильтрованы круглые скобки. Почему он возвращает кортеж одного элемента? Он может быть только слева или справа, и никогда? Кажется очень неинтуитивным. –
В кортеже есть два элемента. Второй - «ByteString», но я проигнорировал его, используя знак подчеркивания в своем ответе. –
О, я понял! Right содержит кортеж, с декодированным Word32 и остальной частью ByteString, который мне неинтересен. Спасибо! –