9

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

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

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

4

2 回答 2

6

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

于 2012-04-17T13:08:03.930 回答
5

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

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

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

fromRational :: (Fractional a) => Rational -> a

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

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

于 2012-04-17T18:32:46.793 回答