3

私は現在Haskellをいじっていますが、私の人生では、次のことがなぜ機能するのかわかりません.....

square :: (Num a) => a -> a 
square x = x * x 
dx = 0.0000001
deriv1 :: (Fractional a) => (a -> a) -> (a -> a)
deriv1 g = (\x -> ((g (x + 2) - (g x)) / 0.0000001 ))   
main = printf "res==%g %g\n" (square 5.12::Double) ((deriv1 square) 2::Float)

しかし、これはそうではありません....

square :: (Num a) => a -> a 
square x = x * x 
dx = 0.0000001
deriv1 :: (Fractional a) => (a -> a) -> (a -> a)
deriv1 g = (\x -> ((g (x + 2) - (g x)) / dx ))          
main = printf "res==%g %g\n" (square 5.12::Double) ((deriv1 square) 2::Float)

dx今回はderv1関数で使用したことに注意してください。私は Haskell を初めて使用するので、型に関する詳細な議論は、すぐに私を通り過ぎてしまい、ぐるぐる回って死ぬでしょう。必須の答えに似たものを持っていることが必須です。そうしないと、Haskell でのキャリアの早い段階でほぼ確実に失われてしまいます。

私が得ているエラーメッセージは次のとおりです。

Inferred type is less polymorphic than expected
  Quantified type variable `a' is mentioned in the environment:
    dx :: a (bound at sicp-1.40.hs:12:0)
When trying to generalise the type inferred for `deriv1'
  Signature type:     forall a. (Fractional a) => (a -> a) -> a -> a
  Type to generalise: (a -> a) -> a -> a
In the type signature for `deriv1'
When generalising the type(s) for `deriv1'
4

3 に答える 3

6

単型性の制限により、エラーが発生します。型シグネチャを与えていないため、この場合のようにdx推論されてしまいます。Double次のような明示的なポリモーフィック署名を与えることができます

dx :: Fractional a => a
dx = 0.0000001

または、ソースファイルの先頭にこの行を含めることで、モノモーフィズムの制限を無効にすることができます

{-# LANGUAGE NoMonomorphismRestriction #-}
于 2012-07-21T07:09:50.393 に答える
4

モノモーフィズムの制限に陥らないようにするためのおそらく最良の方法は、dxローカルにすることです。

deriv1 :: (Fractional a) => (a->a) -> a->a
deriv1 g = (\x -> ((g (x + dx) - (g x)) / dx ))
   where dx = 0.0000001

私も同様に変更2したことに注意してください。それはあなたの定義ではちょっと間違っていました。dx(プログラミング的にではなく、数学的に。)

ところで、これを簡単に書くこともできます

deriv1 g x = (g (x + dx) - g x) / dx

Haskell はこれを自動的にラムダに変換します。

于 2012-07-21T08:13:36.883 に答える
2

単相性の制限により、 の型dxはデフォルトで Double に設定されています。したがって、 in で除算するdxderiv1、Haskell は、もう一方のオペランド/と結果も Double 型でなければならないと推測します。しかし、あなたの型シグネチャは と言うaので、あなたがするエラーが発生します。

dxこれは、型を持つことを明示的に宣言するかFractional a => a、モノモーフィズムの制限を無効にすることで修正できます。

于 2012-07-21T07:09:53.773 に答える