2012-04-17 10 views
8

このGHCiセッションの2行目に注意してください。 Latitudeタイプの場合、コンストラクタを呼び出さずに、値として「裸の」数値を使用できるのはどうですか?自分のタイプのものと似たようなことをしたいと思います。newtypesに「裸の」番号を割り当てる

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

私はLatitudeタイプのソースコードを調べましたが、最初に問題を見つけました。最終的に私は答えを見つけたので、ここでそれを文書化すると思った。下の私の答えを見てください。

答えて

4

Haskell98標準によれば、数値リテラルは実際にはfromIntegerfromRationalを呼び出します。これにより、これらの関数を実装する任意の型に変換することができます(fromIntegerはPrelude.Num typeclassにあり、fromRationalはPrelude.Fractional typeclassにあります)。

数値リテラルの構文は、2.5節で説明します。整数 リテラルは、Integer型の適切な値 に関数fromIntegerを適用することを表します。同様に、浮動小数点の は、fromRationalの値をRational の値(Ratio Integer)に適用することを表します。タイピング所与:

fromInteger ::(NUM A)=>整数 - >

fromRational ::(フラクショナルA)=>合理 - >

整数と浮動リテラルは(タイピングを有しますNum a)=> aと (分数a)=> aとなります。数値リテラルは で定義されているため、適切な数値型の の値として解釈される可能性があります。あいまいさが過負荷になっている の説明は、4.3.4項を参照してください。

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

6

この作品を作るのは、型が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 

に、私は明示的にテンキーを実装することができます。

+4

正確には、 'Seconds'はそれを動作させ、' Num'クラスであるという事実です。それが「Num」クラスのメンバーになったかどうかは関係ありません。 – augustss

+2

インスタンスが派生するのではなく明示的に提供されていれば、これも機能します。あなたが必要とするのは 'instance Num'だけです。 –

+0

augustssとDanielありがとうございました。私は答えを更新しました。 – mhwombat

関連する問題