2016-12-22 14 views
1

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

ответ

2

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

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

Ого, я мысленно отфильтрованы круглые скобки. Почему он возвращает кортеж одного элемента? Он может быть только слева или справа, и никогда? Кажется очень неинтуитивным. –

+1

В кортеже есть два элемента. Второй - «ByteString», но я проигнорировал его, используя знак подчеркивания в своем ответе. –

+0

О, я понял! Right содержит кортеж, с декодированным Word32 и остальной частью ByteString, который мне неинтересен. Спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^