2016-11-28 16 views
1

を生じるハスケルないインスタンス:のための...私は再帰カウントテイラーという関数を記述しようとしている

mcloren x = log (1+x)/(1-x) 

compareWithDelta' :: (Num a, Floating a, Integral a, Ord a) => a -> a -> Bool 
compareWithDelta' x acc = abs (acc - mcloren x) < 1.0e-10 

mcl :: (Floating a, Integral a, Num a) => a -> a 
mcl x = 
let 
    mcl' x acc y 
    | compareWithDelta' x acc = acc 
    | otherwise = mcl' x (2*(x^(2*y+1)/(2*y+1))) (y+1) 
in 
    mcl' x 0 0 

しかし、私はこれらのエラーメッセージがあります。

No instance for (Num a0) arising from a use of 'mcl' 
The type variable 'a0' is ambiguous 
Possible fix: add a type signature that fixes these type variable(s) 
Note: there are several potential instances: 
    instance Num Double — Defined in 'GHC.Float' 
    instance Num Float — Defined in 'GHC.Float' 
    instance Integral a => Num (GHC.Real.Ratio a) 
    — Defined in 'GHC.Real' 
    ...plus three others 
In the expression: mcl 1 
In an equation for 'it': it = mcl 1 

それが何を意味し、どのようにそれを修正するには?

答えて

5

短い答えは、あなたの制約(Integral a, Floating a)が矛盾しているので、あなたがこの「曖昧な型変数」エラーを取得しているということです。これを満たす型はありません。したがって、defaultingが1の型を(入力式の中で)見つけようとすると、それはできません。

それは、フロート1.0e-10との比較から(2.5^2はそのため(^^)を使用し、有効ではありません)左の整数の引数を取り、電力事業者(^)からこれらの制約を取得します。私はちょうど(^^)の代わり(^)を使用してIntegral制約を削除したい推測しています。

数字を入力している場合は、最終的にfromIntegralrealToFracが必要です。これは、異なる数値タイプ間のスレッジハンマー変換関数です。先を見据えて準備するだけです。

左右に両方小数をとるもう一つの指数演算子、(**)、があります。 Haskellが3つの異なるべき乗演算子を持つ理由は、あなたが興味があるならば、別の質問のための飼料です。

+1

私はGHCは1がこのような場合のためにユーザがプログラムの警告/エラーを指定することができるようになりたいです。のように、 "型のチェック/推論の後に' Num(a-> b) 'がそれを示唆しているのであれば..." – chi

関連する問題