2012-09-13 10 views
2

모나드 가져 오기에서 약간의 비트를 읽어야합니다. 이제 내 코드모나드 가져 오기 모나드 가져 오기

나는 상태 모나드의 일종으로이 포장 할
readBits :: Int -> Int -> Get (Word32, Int) 
readBits count state = ... 

readValue :: Get (Word32, Word32) 
readValue = do 
    -- read fst bit count 
    (bits1, s0) <- readBits 5 0 
    -- read bits1 bits as fst 
    (fst, s1) <- readBits bits1 s0 
    -- read snd bit count 
    (bits2, s2) <- readBits 5 s1 
    -- read bits2 bits as snd 
    (snd, s3) <- readBits bits2 s2 
    -- flush incomplete byte 
    when (s3 /= 0) $ skip 1 
    return (fst, snd) 

처럼 보이는

readBits :: Int -> BitReader Word32 
readBits count = ... 

runBitReader :: BitReader a -> Get a 

readValue :: Get (Word32, Word32) 
readValue = runBitReader $ do 
     bits1 <- readBits 5 
     fst <- readBits bits1 
     bits2 <- readBits 5 
     snd <- readBits bits2 
     return (fst, snd) 

과 같은 코드가 어떻게 기능을 구현해야해야 하는가? 어떻게 구현해야합니까?

나는 Get과 BitGet 소스 코드를 살펴 보았지만, 무슨 일이 일어나는지 완전히 이해하지 못했다.

답변

2

이것은 Monad 트랜스포머의 가장 일반적인 용도입니다.

대부분의 구조를 올바르게 정의했습니다. 질문

What functions should I implement? 
  • 그럼 먼저 BitReader를 얻기 위해 StateT 변압기에 Get 모나드를 포장 할 필요가

    대답합니다.
  • readBits에 대한 올바른 정의를 구현하려면 get을 사용하여 현재 상태를 가져오고 put을 사용하여 상태를 다시 저장해야합니다.
  • 모나드에서 출력을 되찾으려면 BitReader에 코드를 실행해야합니다. 따라서 runStateT을 사용하여 runBitReader을 정의해야합니다.

다음 질문에 답하십시오.

How should they be implemented? 

가능한 구현을 제공했습니다. 일부 기능을 정의하여 작동하도록해야합니다.

import Control.Monad.State 
import qualified Control.Monad.State as ST 
import Data.Binary 

type BitReader = StateT Int Get 

readBits' :: Int -> Int -> Get (Word32, Int) 
readBits' = undefined 

readBits :: Int -> BitReader Word32 
readBits n = do 
    s0 <- ST.get 
    (a,s1) <- lift $ readBits' n s0 
    ST.put s1 
    return a 


runBitReader :: BitReader a -> Get a 
runBitReader w = do 
    (a,s) <- runStateT w 0 
    return a 

readValue = do 
     fst <- readBits 5 
     snd <- readBits 10 
     return (fst, snd) 

Get 코드를 조사하는 것이 어떻게 도움이되었는지 알 수 없습니다. 너는 틀린 집에서 찾고 있었다. State MonadsMonad Transformers에 관해 읽어야합니다.

모나드 변압기 here에 대해 자세히 읽을 수 있습니다.

관련 문제