我有以下代码:
nonstopfreq :: Eq a => [a] -> [(a,Int)] -> [(a,Int)]
nonstopfreq (x : xs) (y : ys) = nonstopfreq xs (filter (\y -> not (x == fst y)) ys)
参数是:
String
。[([String],Int)]
但是我收到以下错误,因为?
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
项。
答案 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
仍然无效:没有基本情况,因此当其中一个列表为空时它会崩溃。