2014-10-30 6 views
0

derivingUnbox를 사용하여 유형을 박스 화되지 않은 유형으로 변환하는 데 문제가 있습니다. 나는 코드 아래에 시도하지만주는 오류 "입력에 구문 분석 오류 '->'"[t | Color -> Word32 |]유형을 박스 화되지 않은 유형으로 변환

type Color = (Word8,Word8,Word8) 


    colorToWord32 :: Color -> Word32 
    colorToWord32 (r,g,b) = 0 .|. 
          (shift (fromIntegral r) 24) .|. 
          (shift (fromIntegral g) 16) .|. 
          (shift (fromIntegral b) 8) 

    word32ToColor :: Word32 -> Color 
    word32ToColor color = (r,g,b) 
     where 
      r = fromIntegral (shift (color .&. 0xFF000000) (-24)) 
      g = fromIntegral (shift (color .&. 0x00FF0000) (-16)) 
      b = fromIntegral (shift (color .&. 0x0000FF00) (-8)) 


    derivingUnbox "Color" 
     [t | Color -> Word32 |] 
     colorToWord32 
     word32ToColor 

답변

2

첫 번째 줄에는의가 인용 구문 수정하자,

{-# LANGUAGE 
    MultiParamTypeClasses, TemplateHaskell, TypeFamilies, FlexibleInstances #-} 

derivingUnbox "Color" 
    [t| Color -> Word32 |] 
    [| colorToWord32 |] 
    [| word32ToColor |] 

둘째 이것이주의 여전히 올바르지 않습니다. 에 대해 이미 unbox 인스턴스가 있으므로 새 unbox 인스턴스를 정의하려면 새 data 또는 newtype을 새로 만들어야합니다.

import Data.Vector.Unboxed.Deriving 
import Data.Word 
import Data.Bits 

data Color = Color !Word8 !Word8 !Word8 

colorToWord32 :: Color -> Word32 
colorToWord32 (Color r g b) = 0 .|. 
         (shift (fromIntegral r) 24) .|. 
         (shift (fromIntegral g) 16) .|. 
         (shift (fromIntegral b) 8) 

word32ToColor :: Word32 -> Color 
word32ToColor color = Color r g b where 
    r = fromIntegral (shift (color .&. 0xFF000000) (-24)) 
    g = fromIntegral (shift (color .&. 0x00FF0000) (-16)) 
    b = fromIntegral (shift (color .&. 0x0000FF00) (-8)) 

는 여기에서 우리는 Word32에 대한 기존 unbox 예에 의존하고 있습니다. 또한, 우리는 단지 (Word8, Word8, Word8)unbox 인스턴스를 사용할 수 있습니다

import qualified Data.Vector.Unboxed as UV 
type Color = (Word8, Word8, Word8) 

이제 우리는 단순히 UV.Vector Color를 사용할 수 있습니다.

터플에 대한 기본값 unbox 인스턴스는 하나의 벡터를 사용하고 모든 필드를 하나로 묶는 대신 필드에 여러 개의 상자가없는 벡터를 사용한다는 점에 유의하십시오. 조회 패턴에 따라 구성이 실제로 더 빠릅니다.

+0

감사합니다. 둘 중 어떤 구성이 내 애플리케이션에 더 빠르지를 결정하기 위해 두 구성을 테스트 할 것입니다. – Ahzaz