请注意此GHCi会话中的第二行.什么是Latitude类型允许我使用"裸"数作为值,而不是必须调用构造函数?我想用我自己的一些类型做类似的事情.
?> :m + Data.Geo.GPX.Type.Latitude
?> let t = 45 :: Latitude
?> t
45.0
Run Code Online (Sandbox Code Playgroud)
我已经检查了Latitude类型的源代码,但我一开始很难搞清楚它.最终我找到了答案,所以我想我会在这里记录下来.请参阅下面的答案.
这项工作的原因是该类型是一个数字.最简单的方法是使用"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.
根据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