2011-07-23 7 views

答えて

7

Numは偽のEqとShowの機械以外の情報を抽出するメカニズムを提供していないので、NumからNumに行くことはできませんが、あなたが出てくる番号に代わって、あなたは頼りになることができます。あなたが求めていない、まさに場合

特定

fromIntegral :: (Integral a, Num b) => a -> b 

fromRational :: Fractional a => Rational -> a 

toRational :: Real a => a -> Rational 

の組成は、あなたが何を意味するか行うため、両方の良い候補です。

read . showはよく入力され、あなたが提案する署名がありますが、その意味はゴブリングされています。1つのShowインスタンスによって生成されたテキストが完全に異なるReadインスタンスと互換性があり、多くの反例があるとは何も言いません。

ReadShowの(暗黙の)契約は、同じ種類のものを使用する場合にのみ適用されます。

7

良い方法はありません。いくつかの数字には他の情報より多くの情報が含まれているので、どのようにして2つの任意の数字を良い方法で変換することができますか。いくつかの簡単な例:DoubleをIntに変換するにはどうすればよいですか? Rational 8 to Int8?複雑なダブルからフロートへ?

これらはすべて情報の損失を伴い、明らかな正しい方法はありません。


そして@hammarが言うように、Numの動作は単にあなたがこのような機能を構築することはできません。

0

良い方法は、ラウンドやクランプのような特定の種類の変換を行うことです。そのような機能は、それが言うことをします。

3

タイプ(Num a, Num b) => a -> bの有用な機能を書くことはできません。 abは型変数であるため、私たちが使用できる便利な操作はNumクラスのものだけです。 (EqShowはここではあまり役に立ちません)。

class (Eq a, Show a) => Num a where 
    (+), (-), (*)  :: a -> a -> a 
    negate    :: a -> a 
    abs     :: a -> a 
    signum    :: a -> a 
    fromInteger   :: Integer -> a 

あなたはfromIntegerあると起動するものを持っていなかった場合は、bを行うことができますが、あなたがIntegeraを回す方法はありません、これだけの機能は、あなたが書くことができ、ここでのみ機能このタイプの返すfromIntegerいくつかの定数または底の。それほど役に立たない。


augustss pointed outとにかく、この変換を行う方法はありません。たくさんのタイプがNumになることを覚えておいてください。さまざまな種類の実数だけでなく、複素数、行列、多項式などもあります。それらの間では意味をなさない変換はありません。

関連する問題