由于错误的类型,Haskell中的分区不起作用

时间:2016-12-07 09:57:28

标签: 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

1 个答案:

答案 0 :(得分: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]]中单词的平均长度)。因此,我们希望将getsum1除以length wl1(取决于您对结果的预期格式,有几种方法可以执行此操作)。