例えば、1つの悪い方法は、文字列によって考慮することです:ハスケルでは、num to num変換関数 `toNum ::(Num a、Num b)=> a - > b`を書く良い方法がありますか?
toReadableNum :: (Num a, Num b, Read b) => a -> b
toReadableNum = read . show
ない良い方法がない場合は、他の悪い方法がありますか?実装固有?言語拡張が必要ですか?
例えば、1つの悪い方法は、文字列によって考慮することです:ハスケルでは、num to num変換関数 `toNum ::(Num a、Num b)=> a - > b`を書く良い方法がありますか?
toReadableNum :: (Num a, Num b, Read b) => a -> b
toReadableNum = read . show
ない良い方法がない場合は、他の悪い方法がありますか?実装固有?言語拡張が必要ですか?
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
インスタンスと互換性があり、多くの反例があるとは何も言いません。
Read
とShow
の(暗黙の)契約は、同じ種類のものを使用する場合にのみ適用されます。
良い方法はありません。いくつかの数字には他の情報より多くの情報が含まれているので、どのようにして2つの任意の数字を良い方法で変換することができますか。いくつかの簡単な例:DoubleをIntに変換するにはどうすればよいですか? Rational 8 to Int8?複雑なダブルからフロートへ?
これらはすべて情報の損失を伴い、明らかな正しい方法はありません。
そして@hammarが言うように、Num
の動作は単にあなたがこのような機能を構築することはできません。
良い方法は、ラウンドやクランプのような特定の種類の変換を行うことです。そのような機能は、それが言うことをします。
タイプ(Num a, Num b) => a -> b
の有用な機能を書くことはできません。 a
とb
は型変数であるため、私たちが使用できる便利な操作はNum
クラスのものだけです。 (Eq
とShow
はここではあまり役に立ちません)。
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
を行うことができますが、あなたがInteger
にa
を回す方法はありません、これだけの機能は、あなたが書くことができ、ここでのみ機能このタイプの返すfromInteger
いくつかの定数または底の。それほど役に立たない。
augustss pointed outとにかく、この変換を行う方法はありません。たくさんのタイプがNum
になることを覚えておいてください。さまざまな種類の実数だけでなく、複素数、行列、多項式などもあります。それらの間では意味をなさない変換はありません。