2012-04-17 79 views
8

請注意GHCi會話中的第二行。什麼是Latitude類型,允許我使用「裸」數字作爲值,而不必調用構造函數?我想用我自己的一些類型做類似的事情。將「裸」數字分配給新類型

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

我已經檢查了Latitude類型的源代碼,但是我一開始就遇到了麻煩。最終我找到了答案,所以我想我會在這裏記錄它。請參閱下面的答案。

回答

4

根據Haskell98標準,數字文字實際上是對fromIntegerfromRational的調用。這可以將它們轉換爲實現這些功能的任何類型(fromInteger位於Prelude.Num類型類中,而fromRational位於Prelude.Fractional類型類中)。

數字文字的語法在2.5節給出。一個整數 literal代表從Integer到 Integer類型的適當值的函數應用。同樣,浮點文字 代表fromRational到類型Rational (即比例整數)的值的應用。鑑於分型:

fromInteger ::(民一)=>整數 - >一個

fromRational ::(分數A)=>理性 - >一個

整數和浮點數文字具有分型( Num a)=> a和 (分數a)=> a。數字文字在這種間接方式中定義爲 ,以便它們可以被解釋爲任何適當的數字類型的值。有關 超載模糊的討論,請參見第4.3.4節。

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

6

是什麼使這項工作是該類型是一個數字。最簡單的方法是使用「派生Num」,在這種情況下,我需要語言雜注GeneralizedNewtypeDeriving。因此,我可以創造一個請鍵入以下,

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

然後在GHCI,

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

或者,我可以明確地實現民。

+4

確切的說,這是一個事實,即'Seconds'是在'Num'類,使得它的工作。無論它如何成爲'Num'類的成員並不重要。 – augustss 2012-04-17 13:09:55

+2

如果明確提供實例而不是派生實例,它也可以工作。所有你需要的是一個'實例Num'。 – 2012-04-17 13:10:09

+0

謝謝奧古斯特和丹尼爾。我已經更新了答案。 – mhwombat 2012-04-17 13:20:57

相關問題