无法匹配类型`[Char]'与`Char'

时间:2015-05-05 18:18:30

标签: haskell types

我有以下代码:

nonstopfreq :: Eq a => [a] -> [(a,Int)] -> [(a,Int)]
nonstopfreq (x : xs) (y : ys) = nonstopfreq xs (filter (\y -> not (x == fst y)) ys) 

参数是:

  1. String
  2. 的列表
  3. 元组[([String],Int)]
  4. 但是我收到以下错误,因为?

    Couldn't match type `[Char]' with `Char'
    Expected type: [(String, Int)]
      Actual type: [([String], Int)]
    In the second argument of `nonstopfreq', namely `aPrimerB'
    In the expression: nonstopfreq lStopWords aPrimerB
    In an equation for `aSegon':
        aSegon = nonstopfreq lStopWords aPrimerB
    

    我想要消除列出的元素和元组。

    AprimerB是:[(["the"],1818),(["and"],940),(["to"],809),(["a"],690),(["of"],631),(["it"],545)‌​,(["she"],542),(["said"],462),(["you"],435),(["in"],431)]。 另一个参数lStopWords具有从words获得的类型:

       do
         ...
         stopWords <- hGetContents fileStopWords
         let lStopWords = words stopWords
    

    我尝试删除AprimerB中显示的LstopWords项。

1 个答案:

答案 0 :(得分:1)

嗯,问题是lStopWords只是一个字符串列表(在这个特定情况下是单词) - 即[a] ~ [String]a ~ String。这意味着第二个参数及其常规类型[(a, Int)]变为[(String, Int)]。但是,你已经通过了

aPrimerB = [(["the"],1818), (["and"],940) ... ]

其中每个字符串都包含在单个列表中。所以这个类型是[([String], Int)]。由于每个列表只有一个参数,您实际上可以轻松地将其更改为

aPrimerB :: [(String, Int)]
aPrimerB = [("the",1818), ("and",940) ... ]

将摆脱该错误。

或者,您也可以将单词列表的每个元素包装在另一个单例列表图层中。

   let lStopWords :: [[String]]
       lStopWords = map (:[]) $ words stopWords

然后,您可以保留aPrimerB的旧定义,因为现在a ~ [String]。结果基本相同,但单身人士名单在这里似乎没用。

请注意,即使修复了该错误,nonstopfreq仍然无效:没有基本情况,因此当其中一个列表为空时它会崩溃。