Haskell Can';无法消除此类型错误

Haskell Can';无法消除此类型错误,haskell,ghci,Haskell,Ghci,我正在努力解决这个问题 这是我的代码: import Data.List (nub) main = interact $ unwords . map show . solve . map words . lines solve :: [[String]] -> [Int] solve (_:r:_:a) = map (rank . read) a where records = nub $ map read r :: [Int] rank n = (leng

我正在努力解决这个问题

这是我的代码:

import Data.List (nub)

main = interact $ unwords . map show . solve . map words . lines

solve :: [[String]] -> [Int]
solve (_:r:_:a) = map (rank . read) a
    where records = nub $ map read r :: [Int]
          rank n = (length $ takeWhile (> n) records) + 1
编译器抛出此错误:

    * Couldn't match type `[Char]' with `Char'
      Expected type: [String]
        Actual type: [[String]]
    * In the second argument of `map', namely `a'
      In the expression: map (rank . read) a
      In an equation for `solve':
          solve (_ : r : _ : a)
            = map (rank . read) a
            where
                records = nub $ map read r :: [Int]
                rank n = (length $ takeWhile (> n) records) + 1
  |
6 | solve (_:r:_:a) = map (rank . read) a
  |
我不明白问题是什么。当我在GHCi中一行一行地将其拼合在一起时,它起作用了:

GHCi> import Data.List (nub)
GHCi> records = nub $ map read ["100", "100", "50", "40", "40", "20", "10"] :: [Int]
GHCi> rank n = (length $ takeWhile (> n) records) + 1
GHCi> a = ["5", "25", "50", "120"]
GHCi> map (rank . read) a
[6,4,2,1]

你做了一个错误的模式匹配。由于
solve
必须接受大小正好为4的列表,因此模式匹配必须如下所示:

solve [_,r,_,a] = ...
可将其脱糖为:

solve (_:r:_:a:[]) = ...
或者进一步去糖:

solve (_:(r:(_:(a:[])))) = ...
记住,
在左边接受一个元素,在右边接受一个列表