2014-05-17 1 views
12

나는 벡터 라이브러리를 살펴보고 {-# INLINE_FUSED transform #-}을 발견했으며 그게 무슨 뜻인지 궁금해했다. 나는 그것이 vector.h에 정의 된 것을 본다.하스켈에있는 INLINE_FUSED pragma

답변

11

정의는 INLINE_FUSEDINLINE [1]과 동일 함을의 L합니다. INLINE_INNERINLINE [0]과 같습니다. [1][0]은 인라인 단계를 주문하기위한 표준 ghc입니다. 표제 7.13.5.5 아래의 토론을 참조하십시오. 위상 제어 in http://www.haskell.org/ghc/docs/7.0.4/html/users_guide/pragmas.html

ghc이 다양한 정의를 인라인하는 단계를 제어해야합니다. 먼저 함수 streamunstream의 모든 사용을 노출해야하므로 (특히) stream.unstreamid으로 바꿀 수 있고, 다른 경우에는 전체적으로 배포 된 (다시 쓰는) RULE pragma에 따라 바꿀 수 있습니다.

벡터 함수에 대한 일반적인 벡터는 unstream . f . stream으로 작성되며, 여기서 f는 Stream to Stream 함수입니다. unstreamStream에서 실제 벡터를 메모리에 구축합니다. stream은 실수 벡터를 Stream으로 읽습니다. 게임의 목적은 구축 된 실제 벡터의 수를 줄이는 것입니다. 그래서 세 가지 벡터의 구성이 기능

f_vector . g_vector . h_vector 

를 벡터에 정말

unstream . f_stream . stream . unstream . g_stream . stream . unstream . h_stream . stream 

인 그의 등

unstream . f_stream . g_stream . h_stream . stream 

과에 다시. 그래서 우리는 3 대신에 하나의 새로운 벡터를 씁니다. 그래서 당신이 뭔가 형태로 인라인 방법을 볼 수 있습니다

transform f g (unstream s) = unstream (Bundle.inplace f g s) 
transform f1 g1 (transform f2 g2 p) = transform (f1 . f2) (g1 . g2) p 

https://github.com/haskell/vector/blob/master/Data/Vector/Generic/New.hs#L76에서 : transform에 대한

규칙은 이것보다 조금 더 장식하지만, 순서의 같은 미묘한 시스템에 속하는

unstream . h_stream . stream . transform f1 g1 . transform f2 g2 
        . unstream . j_stream . stream $ input_vector 

을 다시 작성합니다.

+0

아서, 당신은 매우 명확하게 설명했습니다. – jap