2011-10-11 5 views
2

하스켈에서 일하면서 나는 큰 파일 목록을 이진 파일에 쓰려고합니다.Haskell을 사용하여 [Bool]을 이진 파일에 작성

Word8 (8 비트 단어)을 파일에 쓸 수는 있지만 8 개의 Bool 목록을 Word8로 변환하는 방법을 알 수 없습니다.

toByte :: [Bool] -> Word8 
toByte list = toByteh list 0 0 

toByteh :: [Bool] -> Int -> Word8 -> Word8 
toByteh list 8 _ = 0 
toByteh list i result 
    | head list == True = toByteh (tail list) (i + 1) (result .|. (2^i :: Word8)) 
    | otherwise = toByte_h (tail list) (i + 1) result 

난 그냥 0 바이트를 받기를 사용하는 경우 :

는 여기에 지금까지 무슨이다. 아무도 이것이 작동하지 않는 곳을 볼 수 있습니까? 아니면 더 나은 방법이 있습니까?

답변

5

0에서 i을 세며, 8에 도달하면 0을 반환합니다. 난 당신이 대신 result를 반환하는 의미 생각 :

toByteh list 8 result = result 
4

같은 함수를 작성하는 것이 항상 좋은,하지만 당신은 지루 느낌을 시작하면, 당신이 할 수있다 또한 여기

toByte = foldl (\word\bit -> 2*word + (if bit then 1 else 0)) 0 

(목록의 머리 당신이 좋아하지 않으면 가장 낮은 비트, 반대로 간주됩니다.)

+0

cool! 그것은 여러 가지 방식으로 사물을 보는 데 도움이됩니다. –

관련 문제