4

詳細を知りたい問題と、回避する方法があります。私はこのコードを持っています

len :: (Num r ) => [a] -> r
len [] = 0
len xs = 1 + len ( tail xs )

avg :: (Num t) => [t] -> Double
avg xs = ( sum xs ) / ( len xs )

次のエラーが表示されます

len.hs:6:9:
    予想される型「Double」と推測される型「t」を一致させることができませんでした
      `t' は、によって束縛される固定型変数です。
          len.hs:5:12 での「avg」の型シグネチャ
    式: (sum xs) / (len xs)
    「avg」の定義: avg xs = (sum xs) / (len xs)

これで、このエラー (irc.freenode.net#haskell のおかげ) が除算関数の結果であることがわかりました。

(/) :: (Fractional a) => a -> a -> a

しかし、私は何をすべきかわかりません。私のavg関数シグネチャは、除算演算子の癖 (型クラスが必要) とは何の関係もないはずFractionalです。だから、これを克服する正しい方法は、型クラスを実装する型にキャストすることFractionalだと考えていますが、その方法、またはこれが正しいかどうかさえわかりませんか? 何か案は?

4

4 に答える 4

7

私のavg関数シグネチャは、除算演算子の癖とは何の関係もないはずです

何故ですか?多数の整数の平均を計算する場合は、ある時点で除算する必要があるため、それらを整数から選択した除算をサポートする型に変換する必要があります。Numクラス ( :i Numghci 内) をよく見ると、avg:の型に関する 1 つの問題が明らかになりましたNum。基本的に、足し算、掛け算、引き算を行うのに十分なメソッドがありません。私が与えた数値avgが a に変換できるという保証はまったくありませんDouble

平均を計算するために型指定されていない関数を入力すると、Haskell は可能な限り一般的な型で応答します。

Prelude List> :type \x -> sum x / genericLength x
\x -> sum x / genericLength x :: (Fractional a) => [a] -> a

これが の正しいタイプですavg

avg [1,2,3 :: Integer]タイプエラーが発生することに気付くかもしれません。引数をtoRationalorに渡すことfromIntegralで、これを回避できます。これは、RealとのIntegralインスタンスをIntegerそれぞれ使用します。


式に関してsum [1,2,3] / len [1,2,3]: のようなリテラル数1が の型を持っていることは事実です。これは、どのような型でNum a => aあるかを呼び出しますfromIntegerが、式のような1/2はより具体的な型の を持ち、Fractional a => aその型を尋ねればわかります。印刷する代わりに表現します。

役立つかもしれないのは:set -Wallghci にあります。これは、デフォルトのタイプが選択されるたびに多くの警告をオンにし、最も一般的なタイプが正しくない可能性があるという手がかりを与えます。

于 2009-11-29T23:17:53.117 に答える
5

avg のタイプを過度に制限しています。より一般的なバージョン avg :: (Fractional a) => [a] -> a を使用します

于 2009-11-29T23:15:48.223 に答える
1

うーん、本当に問題なのは、それが分数型にキャストしたい整数型の場合ですが、分数型の場合はそのままにしておくことです。

これを試して

fromRational ((sum xs) % (leng xs))
于 2009-11-29T23:05:33.823 に答える
0

この問題に遭遇しました。私がなんとかしたこの最善の方法は、平均化のための2つの関数を持つことです.1つは積分用で、もう1つは分数用です:

avgInt :: (Integral i, Fractional f) => [i] -> f
avgInt xs = fromIntegral (sum xs) / fromIntegral (length xs)

avgFrac :: (Fractional f) => [f] -> f
avgFrac xs = sum xs / fromIntegral (length xs)
于 2010-10-09T15:33:52.227 に答える