2017-09-24 64 views
0

我對Haskell很新,我正在嘗試做一個基本的函數,它可以找到列表的意思。我幾乎已經解決了,除了我必須做的最後一部分。Haskell中的兩個函數的劃分

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) 

這是我開始,其中listSum和listLength基本上具有相同的功能之和長度上的運營商名單分別listMean需要這兩個和將其劃分。當我運行這一點,但是,我得到一個錯誤說「無法演繹(分數一)從使用‘/’從上下文的產生:民爲」

起初,我只是覺得我用了錯誤的類型和切換listmean以listMean ::(分數a)=> [a] - > a開頭。這允許我編譯,但是當我試圖通過給它randInts運行它時,但是我得到錯誤消息「沒有使用'listMean'引發的(Fractional Int)實例。」

我不知道我在這裏失蹤。請給我一些建議嗎?

+0

您的意思是刪除小數?我做到了這一點,它給了我一個錯誤,說「預期的類型,但'一'有種'約束'」 –

+0

這給了我錯誤「沒有實例(分數INT)由於使用'listMean'」 –

回答

2

在猜測:你正在測試這與ghci listMean randInts。這是一個問題,因爲Int不支持通過(/)進行劃分,而是支持通過div進行整數劃分(以避免某種類型的錯誤在混淆兩者的語言中出現)。

你有兩個明顯的選擇,即,將您Int s到的東西,不支持部門(如Double)或隨機生成Double S IN首位。

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

順便說一句,如果我的猜測是正確的:在未來,你真的應該包括所有的,你做的事情,我們一起在家裏玩能跟着他們的詳細信息,在這麼多的細節和看到完全相同的錯誤; 你應該包括錯誤的全部內容,特別是因爲在這種情況下,它提到了導致它的代碼片段,並且會使診斷瞬時完成。

+0

我沒有想過用float來測試它,我發現它現在可以和float值一起工作。感謝您的建議(儘管現在我無法讓解釋器將int轉換爲float) –

1

的問題是:

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

施加[Int],既listSumlistLength回報Int,不支持/。您需要在除法之前轉換返回值:

listMean :: (Num a, Integral a) => [a] -> Double 
listMean [] = 0 
listMean x = (fromIntegral $ listSum x)/(fromIntegral $ listLength x)