2016-06-27 5 views
1

分数型をダブルに追加する必要がある関数を定義しようとしていますが、エラーが発生するようです。分数型の追加に関する問題

epsilon = 0.0000001 
dif :: (Fractional a) => (a->a) -> a -> a 

dif f x = (f(x+epsilon)-f(x))/epsilon 

HaskellはトラブルのX +イプシロンを解釈を有することと思われるが、これは、xが関数宣言およびイプシロンに分数型であると定義されていることを考えると、奇数思わフラクショナル型クラスの一部である(二重です?相続人

私が取得エラー:

Couldn't match expected type ‘a’ with actual type ‘Double’ 
    ‘a’ is a rigid type variable bound by 
     the type signature for dif :: Fractional a => (a -> a) -> a -> a 
     at dif.hs:3:8 
Relevant bindings include 
    x :: a (bound at dif.hs:5:7) 
    f :: a -> a (bound at dif.hs:5:5) 
    dif :: (a -> a) -> a -> a (bound at dif.hs:5:1) 
In the second argument of ‘(+)’, namely ‘epsilon’ 
In the first argument of ‘f’, namely ‘(x + epsilon)’ 

はありがとう

答えて

6

epsilonに適切にポリモーフィック型シグネチャを与えます。:

epsilon :: Fractional a => a 

What is the monomorphism restriction?の説明も好きかもしれません。

+0

特に、 'epsilon'はDoubleですので、' dif'は 'a〜Double'だけで動作します。しかし、型シグネチャは、*任意の* Fractional aで動作することを約束しています。コンパイラは、あなたの実装が 'dif'に依存しているので、この約束通りではないことに気づいています。 – amalloy

関連する問題