2016-12-07 62 views
-4

我試圖獲得列表中所有元素的總和,到目前爲止有效。我有元素的數量。我想把總和除以數量得到此列表中所有元素的平均值。該部門給我一個我無法修復的錯誤。 我的代碼:Haskell中的分區由於類型錯誤而不工作

module HA 

where 

import FPH 
import Data.List.Split 
import Data.Char 
import qualified Data.Text hiding (length) 

s1 = splitOn " " sonnet18 
s2 = splitOn " " sonnet73 

countSubStrs str sub = length $ Data.Text.breakOnAll (Data.Text.pack sub) (Data.Text.pack str) 

task :: IO() 
task = do 
    let wordLengths = map length 
    let wl1 = wordLengths s1 
    let wl2 = wordLengths s2 
    let getsum1 = sum wl1 
    let ln [] = 0 
    let ln (x:xs) =1 + ln xs 
    let average = wl1 `quot` getsum1 
    print average 

錯誤:

Couldn't match expected type '[Int]' with actual type 'Int' 
In the second argument of `quot´, namely `getsum1´ 
In the expression: wl1 `quot´ getsum1 
In an equation for `average´: average = wl1 `quot´ getsum1 
+0

什麼是's1'和's2'? – Sibi

+1

請提供[MCVE](http://stackoverflow.com/help/mcve) –

+0

哦,對不起。 s1和s2是類型列表的兩個十四行詩。我用SplitOn將文本字符串轉換爲列表。 –

回答

1

讓我們通過一些類型的行走開始:

task :: IO() 
task = do 
    let wordLengths = map length -- (:: [[Char]] -> [Int]) 
    let wl1 = wordLengths s1  -- (:: [Int]) 
    let wl2 = wordLengths s2  -- (:: [Int]) 
    let getsum1 = sum wl1  -- (:: Int) 
    let ln [] = 0 
    let ln (x:xs) =1 + ln xs 
    let average = wl1 `quot` getsum1 
    print average 

我們應該看這裏的條件是wl1getsum1,因爲我們的錯誤發生在涉及他們的操作上。一,功能quot

ghci>> :t quot 
Integral a => a -> a -> a 

因此,我們可以將其應用到兩個參數是該類型類Integral的成員。這兩個論點是否都能滿足這個約束?我們說getsum1上面有Int,所以我們很好。另一方面,wl1的類型爲[Int]。這是我們的問題。

根據你所概述的,我們應該如何解決這個問題?我們希望將長度總和除以列表中的項目數(大概是從我們原來的[[Char]]中獲得單詞的平均長度)。所以我們希望按除以length wl1(取決於您期望的結果格式,有幾種方法可以做到這一點)。