2017-09-24 4 views
0

私はHaskellにとって非常に新しく、リストの平均を求める基本関数を作ろうとしています。私はほとんどそれを解決した、除算の最後のビットを除いて。これは私がlistSumとLISTLENGTHは基本的にそれぞれのリストの合計と長さの演算子と同じ機能を持っているとlistMeanは、これら二つを取り、それらを分ける場合は、使用を開始するものであるHaskellでの2つの関数の除算

randInts = take 5 $ randoms (mkStdGen 11) :: [Int] 

listSum :: (Num a) => [a] -> a 
listSum [] = 0 
listSum (x:xs) = x + listSum xs 

listLength :: (Num a) => [a] -> a 
listLength [] = 0 
listLength (x:xs) = 1 + listLength xs 

listMean :: (Num a) => [a] -> a 
listMean [] = 0 
listMean x = (listSum x)/(listLength x) 

。私はこれを実行すると、しかし、私はは「文脈から 『/』の使用に起因する(A分数)を推論できませんでした:のNum」というエラーを取得

最初に、私はちょうど私が使用していたと思いました間違った型と切り替えられたlistMean :: listMean ::(araction a)=> [a] - > a。これにより私はコンパイルすることができましたが、randIntsを与えて実行しようとしたときに、「listMeanを使用しているために(Fractional Int)のインスタンスがありません」というエラーメッセージが表示されました。

私はここで何が欠けているのか分かりません。私はいくつかのアドバイスをお願いできますか?

+0

分数を削除することを意味しますか?私はそれをして、私に "タイプが期待されていると言ったエラーが発生しましたが、 'a'はkind 'Constraint'を持っています –

+0

それは" listMean 'の使用から生じる "(分数int)のインスタンスがありません" –

答えて

2

ghciでlistMean randIntsとテストしています。 Int(/)での除算をサポートしていませんが、divで整数除算をサポートしています(2つを組み合わせた言語で特定のクラスのバグが発生するのを避けるため)。

あなたはIntを分割をサポートするもの(例えばDouble)に変換するか、最初にランダムDoubleを生成するという2つの明白な選択肢があります。私の推測が正しければところで

listMean (map fromIntegral is) :: Double 
listMean . take 5 . randoms $ mkStdGen 11 :: Double 

、:将来的には、あなたは本当に私たちはそれに従うことができ、自宅で一緒に遊ぶことはあまり詳細にあなたがやったのすべての詳細を含めるとすべきですまったく同じエラーを参照してください。 およびには、エラーの内容全体を含める必要があります。特にこの場合は、原因となったコードスニペットが記述されており、瞬時に診断が行われるためです。

+0

前に浮動小数点でこれをテストするとは考えていませんでした。浮動小数点値で動作することがわかりました。アドバイスをありがとう(うれしい今私はintを浮動小数点に変換するインタプリタを得るのに問題がありますが) –

1

問題は、ということである。[Int]が印加

(Num a) => [a] -> a 

/をサポートしていない両方listSumlistLength戻りInt、。除算前に戻り値を変換する必要があります。

listMean :: (Num a, Integral a) => [a] -> Double 
listMean [] = 0 
listMean x = (fromIntegral $ listSum x)/(fromIntegral $ listLength x) 
関連する問題