9

このGHCiセッションの2行目に注意してください。コンストラクターを呼び出す代わりに、値として「裸の」数値を使用できるようにするLatitudeタイプについてはどうでしょうか。私自身のタイプのいくつかと同じようなことをしたいと思います。

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

Latitudeタイプのソースコードを調べましたが、最初はわかりませんでした。やがて答えが見つかったので、ここに文書化しようと思いました。以下の私の答えを参照してください。

4

2 に答える 2

6

この作業を行うのは、型が Num であることです。これを行う最も簡単な方法は、"deriving 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標準によると、数値リテラルは実際にはとへの呼び出しfromIntegerですfromRational。これにより、これらの関数を実装する任意の型に変換できます(fromIntegerはPrelude.Num型クラスにあり、fromRationalはPrelude.Fractional型クラスにあります)。

数値リテラルの構文はセクション2.5に記載されています。整数リテラルは、関数fromIntegerの整数型の適切な値への適用を表します。同様に、浮動リテラルは、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 に答える