2012-11-30 21 views
7
showInt :: Int -> String 
showInt x = show x 

Liệu các mã trên gọi show đi qua các từ điển Int hay nó gọi trực tiếp các chức năng công bố trên Show Int dụ?GHC có loại bỏ sự đa hướng đa hình khi có thể không?

Ý tôi là, GHC có loại bỏ sự đa hướng đa hình khỏi mã được tạo khi có thể không?

+2

Nó thường sẽ làm, như được hiển thị bởi hammar, và đôi khi không. Do đó, câu hỏi tổng quát hơn là: "Những tình huống nào ngăn GHC tối ưu hóa tính không đồng nhất của dictionnary?" . Tôi biết một số tình huống liên quan đến phần mở rộng, nhưng IIRC cũng có những trường hợp như vậy trong Haskell 98, có thể với các hàm đệ quy đa hình. –

Trả lời

10

Có. Đây là lõi được tạo bằng GHC 7.4.2:

Foo.showInt :: GHC.Types.Int -> GHC.Base.String 
[... attributes omitted ...] 
Foo.showInt = GHC.Show.$fShowInt_$cshow 

Như bạn có thể thấy, đây chỉ là tham chiếu trực tiếp đến GHC.Show.$fShowInt_$cshow.

Hãy so sánh với những gì sẽ xảy ra nếu chúng ta loại bỏ các chữ ký kiểu để các suy ra loại Show a => a -> String được sử dụng thay vì:

Foo.showInt 
    :: forall a_aop. GHC.Show.Show a_aop => a_aop -> GHC.Base.String 
[... attributes omitted ...] 
Foo.showInt = 
    \ (@ a_aot) ($dShow_aou :: GHC.Show.Show a_aot) (x_a9Z :: a_aot) -> 
    GHC.Show.show @ a_aot $dShow_aou x_a9Z 

Ở đây, phải mất một cuộc tranh luận từ điển $dShow_aou và nó sử dụng các chức năng accessor GHC.Show.show nhìn lên chức năng thích hợp từ từ điển này trước khi áp dụng hàm kết quả cho đối số x_a9Z.

Điều gì xảy ra trong trường hợp đầu tiên, ít nhất là về mặt khái niệm, vì loại bê tông được biết, GHC chèn tham chiếu trực tiếp vào từ điển thể hiện thích hợp thay vì dùng nó làm đối số. Sau đó, người truy cập, về cơ bản chỉ là một hãng thu âm, có thể được gạch chân và bạn để lại với một tham chiếu trực tiếp đến hàm thích hợp.

-7

GHC không làm điều đó. Hãy nghĩ về một kiểu tạo mới cho readibility:

type Vector = (Float, Float) 

Nếu GHC sẽ loại bỏ Polymorphicism từ một chức năng như:

(!+!) :: Vector -> Vector -> Vector 
(x1, y1) !+! (x2, y2) = (x1 + x2, y1 + y2) 

Các loại sẽ trở thành:

(!+!) :: (Float, Float) -> (Float, Float) -> (Float, Float) 

Trong khi chức năng là ment cho riêng của Vector.

+5

Tuyên bố 'loại Vector = (Float, Float)' có nghĩa là loại 'Vector' và loại' (Float, Float) 'là giống nhau, và hàm của bạn có cả kiểu« Vector -> Vector -> Vector 'và kiểu' (Float, Float) -> (Float, Float) -> (Float, Float) 'bởi vì chúng có nghĩa là giống nhau, vì vậy không, điều đó không chính xác. – AndrewC

+3

Khi tạo mã GHC chuyên chức năng đa hình nếu có thể, tạo ra các phiên bản hiệu quả hơn ở các loại đã biết. Nội tuyến cũng có thể được sử dụng để giải quyết chuyển hướng. –

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