2012-03-28 14 views
7

Cho mã sau đây (được sao chép từ thư viện attoparsec) pragma nội tuyến làm gì? Tôi cho rằng nó chỉ có ý nghĩa đối với chỉ fmapR để được nội tuyến, chứ không phải là các khác fmap s được xác định trong các trường hợp Functor khác.INLINE Pragma kết hợp với các kiểu lớp

instance Functor (IResult t) where 
    fmap = fmapR 
    {-# INLINE fmap #-} 

Trả lời

4

Các pragma inline sẽ sao chép nội dung của hàm (trong trường hợp này fmapR) đến vị trí nơi nó được gọi là, nếu trình biên dịch có thể chứng minh rằng các functor đang được sử dụng là IResult.

Chức năng không thể được inlined trong trường hợp sau đây, bởi vì định nghĩa của fmap không biết:

f :: Functor f => f Int -> f Float 
f = fmap fromIntegral 

Ở đây, tuy nhiên, nó được biết đến, bởi vì một functor nhất định đang được sử dụng, và các chức năng có thể được gạch chân:

f :: IResult Int -> IResult Float 
f = fmap fromIntegral 
-- rewritten to: f = fmapR fromIntegral; might be further inlined 
+2

Ah, vì vậy fmap được "viết lại" thành fmapR, nhưng fmapR có thể không được gạch chân, nếu tôi hiểu chính xác? – Long

+0

@Long - vâng, đúng vậy. –

Các vấn đề liên quan