2016-10-11 13 views
6

Gần đây, tôi đã xem cụm từ "loại sản phẩm được nâng lên", tương phản với cụm từ chưa được nâng cấp.Loại sản phẩm được nâng cấp và chưa được sản xuất trong Haskell là gì?

Tôi không thể nhớ lại ngữ cảnh, nhưng tôi thấy có những câu hỏi khác về Stack Overflow hỏi về những bất lợi của các loại sản phẩm chưa được lọc (example).

Tôi biết nhiều hay ít loại sản phẩm là gì. Nó giống như (a, b) hoặc Foo a b c tương ứng với một sản phẩm Descartes từ lý thuyết tập hợp.

Thuật ngữ "dỡ bỏ" và "chưa được sửa" có nghĩa là gì trong ngữ cảnh này?

+0

Câu hỏi liên quan: https://stackoverflow.com/questions/27095011/what-exactly-is-the-kind-in-haskell – danidiaz

Trả lời

6

Từ GHC docs:

“nhấc” loại có nghĩa là về chủng loại mà bạn có thể xuống dưới.

loại "được đóng hộp" có nghĩa là giá trị được biểu thị bằng con trỏ đến đối tượng heap.

Một số hàm ý bao gồm:

  • Một dỡ bỏ loại được đóng hộp (nhưng không nhất thiết phải là cách khác - hãy kiểm tra các liên kết trên để biết thêm)
  • loại Hộp Bọc không thể có thunks (bởi vì đó là con trỏ dữ liệu cho bạn biết cách tạo ra giá trị), vì vậy không có sự lười biếng. Họ thực sự chỉ giữ giá trị. Điều này cũng có nghĩa là chúng có thể nhanh hơn.
  • Tính đa hình không phát với các loại chưa được lọc. Bất cứ khi nào bạn thấy một biến kiểu, tất cả các loại liên quan đều chưa được sửa đổi. Một cái gì đó như id 0 :: Int# không hoạt động. Kiểm tra this answer để xem cách bạn có thể (kể từ khi GHC 8.0) đôi khi điều động xung quanh việc này.

Lưu ý rằng bạn có thể tạo ra sản phẩm unlifted trong GHC sử dụng MagicHashUnboxedTuples phần mở rộng (mặc dù tôi không nghĩ rằng họ chơi tốt với GHCi):

{-# LANGUAGE MagicHash, UnboxedTuples #-} 

extGCD :: Int -> Int -> (# Int, Int, Int #) 
extGCD a 0 = (# 1, 0, a #) 
extGCD a b = let (q, r) = a `quotRem` b 
       (# s, t, g #) = extGCD b r 
      in (# t, s - q * t, abs g #) 

Ngoại trừ phần mở rộng này, Tôi tin rằng các loại duy nhất chưa được tìm thấy bạn sẽ tìm thấy là trong GHC.Exts và là các loại nguyên thủy. Có một số thảo luận để cho phép các loại dữ liệu chưa được tùy chỉnh được tích hợp vào GHC here.

Một nhận xét cuối cùng: trong khi các loại được nâng lên có loại *, các loại chưa được loại có loại #. This answer cho câu hỏi được liên kết trong các nhận xét sẽ đi vào chi tiết hơn về điều này.

+0

"Đa hình không chơi với các loại chưa được giải phóng": bzzzt. Tính đa hình không chơi với các loại * không được mở hộp *. Tính đa hình hoạt động tốt với các loại chưa được lọc, ví dụ: trong ML (mặc dù hệ thống loại của Haskell có thể không đủ linh hoạt để hỗ trợ nó). –

+0

@jcast Đúng vậy - Tôi có nghĩa là nhận xét trong ngữ cảnh của hệ thống loại của Haskell, trong đó các biến kiểu có kiểu '*' trừ khi được quy định khác. Các liên kết sau đây thực sự cho thấy cách hạn chế này có thể được nâng lên với các tính năng đa hình mới hơn của GHC 8.0. Điều đó có làm rõ? – Alec

5

Từ GHC documentation:

Lifted 

A type is lifted iff it has bottom as an element. 

Một giá trị của một loại nâng lên có thể bottom. Tức là, nó có thể là undefined, hoặc có lẽ là một tính toán không bao giờ kết thúc, hoặc một phép tính ném một ngoại lệ.

Trong khi đó, các loại chưa được lọc không có các giá trị phụ có thể gây phiền toái. Điều này có thể hữu ích ở cấp độ "ngữ nghĩa" thuần túy (nếu bạn không muốn những giá trị thừa đó) và nó cũng có thể tạo điều kiện triển khai hiệu quả hơn bằng cách giảm thiểu những sự không đồng ý tốn kém. Tối ưu hóa GHC được gọi là the worker-wrapper transformation khai thác điều này (xem phần 5.1 của bài báo được liên kết).

Các loại nâng và không có các loại khác nhau. Các loại được nâng lên trực tiếp trong *, các loại chưa được sửa đổi trong #.

Hiện tại GHC không cho phép bạn xác định các kiểu dữ liệu phức tạp chưa được xử lý của mình một cách dễ dàng. Nhưng có proposals để cho phép điều đó.

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