나는 벡터 라이브러리를 살펴보고 {-# INLINE_FUSED transform #-}
을 발견했으며 그게 무슨 뜻인지 궁금해했다. 나는 그것이 vector.h
에 정의 된 것을 본다.하스켈에있는 INLINE_FUSED pragma
답변
정의는 INLINE_FUSED
이 INLINE [1]
과 동일 함을의 L합니다. INLINE_INNER
은 INLINE [0]
과 같습니다. [1]
및 [0]
은 인라인 단계를 주문하기위한 표준 ghc입니다. 표제 7.13.5.5 아래의 토론을 참조하십시오. 위상 제어 in http://www.haskell.org/ghc/docs/7.0.4/html/users_guide/pragmas.html
는 ghc
이 다양한 정의를 인라인하는 단계를 제어해야합니다. 먼저 함수 stream
및 unstream
의 모든 사용을 노출해야하므로 (특히) stream.unstream
은 id
으로 바꿀 수 있고, 다른 경우에는 전체적으로 배포 된 (다시 쓰는) RULE pragma에 따라 바꿀 수 있습니다.
벡터 함수에 대한 일반적인 벡터는 unstream . f . stream
으로 작성되며, 여기서 f는 Stream to Stream 함수입니다. unstream
은 Stream
에서 실제 벡터를 메모리에 구축합니다. 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
을 다시 작성합니다.
아서, 당신은 매우 명확하게 설명했습니다. – jap