请注意此GHCi会话中的第二行。什么是Latitude类型允许我使用“裸”数作为值,而不是必须调用构造函数?我想用我自己的一些类似的东西做点什么。
λ> :m + Data.Geo.GPX.Type.Latitude
λ> let t = 45 :: Latitude
λ> t
45.0
我已经检查了Latitude类型的源代码,但是我一开始很难搞清楚它。最终我找到了答案,所以我想我会在这里记录下来。请参阅下面的答案。
答案 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标准,数字文字实际上是对fromInteger
和fromRational
的调用。这允许将它们转换为实现这些函数的任何类型(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