将“裸”数字分配给newtypes

时间:2012-04-17 13:05:26

标签: haskell pragma

请注意此GHCi会话中的第二行。什么是Latitude类型允许我使用“裸”数作为值,而不是必须调用构造函数?我想用我自己的一些类似的东西做点什么。

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

我已经检查了Latitude类型的源代码,但是我一开始很难搞清楚它。最终我找到了答案,所以我想我会在这里记录下来。请参阅下面的答案。

2 个答案:

答案 0 :(得分:6)

这项工作的原因是类型是Num。最简单的方法是使用“derived 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

或者,我可以明确地实现Num。

答案 1 :(得分:4)

根据Haskell98标准,数字文字实际上是对fromIntegerfromRational的调用。这允许将它们转换为实现这些函数的任何类型(fromInteger在Prelude.Num类型类中,fromRational在Prelude.Fractional类型类中。)

  

数字文字的语法在2.5节中给出。一个整数   literal表示函数fromInteger的应用   适当的Integer类型的值。同样,浮动文字   表示将fromRational应用于Rational类型的值   (即,比率整数)。给出了类型:

     

fromInteger ::(Num a)=>整数 - >一个

     

fromRational ::(Fractional a)=>理性 - >一个

     

整数和浮动文字的类型(Num a)=>一个和   (分数a)=> a,分别。数字文字定义在   这种间接方式使它们可以被解释为任何值   适当的数字类型。有关讨论,请参见第4.3.4节   超载歧义。

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