2012-04-17 25 views
8

Lưu ý dòng thứ hai trong phiên GHCi này. Điều gì là nó về loại Latitude cho phép tôi sử dụng một số "trần" như là một giá trị, thay vì phải gọi một constructor? Tôi muốn làm một cái gì đó tương tự với một số loại của riêng tôi.Chỉ định số "trần" cho newtypes

λ> :m + Data.Geo.GPX.Type.Latitude                         
λ> let t = 45 :: Latitude                            
λ> t                                 
45.0 

Tôi đã kiểm tra mã nguồn cho loại Latitude, nhưng lúc đầu tôi gặp khó khăn khi tìm ra. Cuối cùng tôi tìm thấy câu trả lời, vì vậy tôi nghĩ tôi sẽ ghi lại nó ở đây. Xem câu trả lời của tôi dưới đây.

Trả lời

4

Theo tiêu chuẩn Haskell98, các chữ số thực sự là các cuộc gọi đến fromIntegerfromRational. Điều này cho phép chúng được chuyển đổi thành bất kỳ loại nào thực hiện các chức năng đó (fromInteger nằm trong kiểu chữ Prelude.Num và fromRational nằm trong kiểu chữ Prelude.Fractional).

Cú pháp của các chữ số được đưa ra trong Phần 2.5. Số nguyên chữ đại diện cho việc áp dụng hàm từInteger đến giá trị thích hợp của kiểu Số nguyên. Tương tự, một ký tự nổi là viết tắt của một ứng dụng từRational đến một giá trị kiểu Rational (tức là, Ratio Integer). Với typings:

fromInteger :: (Num a) => Integer -> một

fromRational :: (Fractional a) => Rational -> một số nguyên

và literals nổi có typings (Num a) => a và (Phân số a) => a, tương ứng. Các chữ số được xác định trong cách gián tiếp này để chúng có thể được hiểu là các giá trị của bất kỳ loại số thích hợp nào. Xem Phần 4.3.4 để thảo luận về sự mơ hồ quá tải.

http://www.haskell.org/onlinereport/basic.html#numeric-literals

6

Điều gì làm cho công việc này là loại là số. Cách dễ nhất để làm điều đó là sử dụng "lấy số", trong trường hợp đó tôi cần pragma ngôn ngữ GeneralizedNewtypeDeriving. Vì vậy, tôi có thể tạo ra một loại như sau,

newtype Seconds = Seconds Double deriving (Eq, Ord, Enum, Num, Fractional, Floating, Real, RealFrac, RealFloat, Show) 

Và sau đó trong GHCi,

λ> let s = 5 :: Seconds                            
λ> s                                 
Seconds 5.0 

Ngoài ra, tôi có thể thực hiện một cách rõ ràng Num.

+4

Chính xác hơn, đó là một thực tế rằng 'Seconds' là trong lớp' Num' mà làm cho nó làm việc. Nó không quan trọng làm thế nào nó trở thành một thành viên của lớp 'Num'. – augustss

+2

Nó cũng sẽ hoạt động nếu cá thể được cung cấp rõ ràng hơn là bắt nguồn. Tất cả những gì bạn cần là một 'instance Num'. –

+0

Cảm ơn bạn augustss và Daniel. Tôi đã cập nhật câu trả lời. – mhwombat

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