将"裸"数字分配给newtypes

mhw*_*bat 9 haskell pragma

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

?> :m + Data.Geo.GPX.Type.Latitude                                                                                                   
?> let t = 45 :: Latitude                                                                                                            
?> t                                                                                                                                 
45.0
Run Code Online (Sandbox Code Playgroud)

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

mhw*_*bat 6

这项工作的原因是该类型是一个数字.最简单的方法是使用"derived num",在这种情况下我需要语言编译指示GeneralizedNewtypeDeriving.所以我可以创建如下类型,

newtype Seconds = Seconds Double deriving (Eq, Ord, Enum, Num, Fractional, Floating, Real, RealFrac, RealFloat, Show)
Run Code Online (Sandbox Code Playgroud)

然后在GHCi,

?> let s = 5 :: Seconds                                                                                                              
?> s                                                                                                                                 
Seconds 5.0
Run Code Online (Sandbox Code Playgroud)

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

  • 确切地说,事实是`Seconds`在'Num`类中使它工作.它如何成为"Num"类的成员并不重要. (4认同)
  • 如果明确提供实例而不是派生实例,它也会起作用.你需要的只是一个`实例Num`. (2认同)

hug*_*omg 5

根据Haskell98标准,数字文字实际上是对fromInteger和的调用fromRational。这样就可以将它们转换为实现这些功能的任何类型(fromInteger在Prelude.Num类型类中,fromRational在Prelude.Fractional类型类中)。

数字文字的语法在第2.5节中给出。整数文字表示将函数fromInteger应用于Integer类型的适当值。类似地,浮动文字代表fromRational到Rational类型(即Ratio Integer)值的应用。给定类型:

fromInteger ::(数字a)=>整数-> a

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

整数和浮点文字分别具有(Num a)=> a和(Fractional a)=> a的类型。数字文字以这种间接方式定义,以便可以将它们解释为任何适当数字类型的值。有关过载歧义的讨论,请参见第4.3.4节。

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