Haskell无法匹配类型'String - > [Int]'with'[a0]'

时间:2017-11-17 20:08:53

标签: haskell types

我想创建一个程序来计算列表中所有元素的出现并返回最大序列。我的输入部分有问题。

输入包含几个测试用例。每个测试用例以包含两个整数n和q(1≤n,q≤100000)的行开始。下一行包含n个整数a1,...,a(-100000≤ai≤100000

我希望readNQ将n和q作为[int],然后传递给readArray,它将读取n元素并分配给[int],如下所示

module Main where

import Text.Printf
import Data.List

main :: IO()
main = interact (showResults . maxSeqLength . readArray. readNQ)

readNQ :: String -> [Int]
readNQ =  take 2 . (map read) . words

readArray :: [Int] -> String -> [Int]
readArray (n:xs) = take n . (map read) . words


showResults ::  Int -> String
showResults x = printf "\n %d" x

maxSeqLength :: Eq a => [a] -> Int
maxSeqLength [] = 0
maxSeqLength xs = (maximum . map length . group) xs

但是,有一个错误。

frequent.hs:13:47:错误:

• Couldn't match type ‘String -> [Int]’ with ‘[a0]’
  Expected type: String -> [a0]
    Actual type: String -> String -> [Int]
• Probable cause: ‘(.)’ is applied to too few arguments
  In the second argument of ‘(.)’, namely ‘readArray . readNQ’
  In the second argument of ‘(.)’, namely
    ‘maxSeqLength . readArray . readNQ’
  In the first argument of ‘interact’, namely
    ‘(showResults . maxSeqLength . readArray . readNQ)’

readNQ和readArray的类型有什么问题?

2 个答案:

答案 0 :(得分:0)

[Int]

这需要String -> [Int]并返回一个函数maxSeqLength :: Eq a => [a] -> Int

[a]

接受列表Int并返回String -> [Int]

由于函数[a]不是列表(.),因此您无法使用readNQ = take 2 . (map read) . words 撰写它们。

除了错误,还要注意

(... . fun . readNQ)

从输入中读取前两个整数,并丢弃其余的整数。它已经消失了。函数链readNQ中的下一个函数无法访问从第一个函数抛出的函数。

如果您希望下一个功能使用它,则需要修改([n1,n2], restOfTheInput),以便返回一对interact

可能代码将变得过于复杂而无法以无点样式表达,但这样做没问题。此外,{{1}}很快就开始无法用于大型任务。

答案 1 :(得分:0)

那是因为你在函数readArray :: [Int] -> String -> [Int]中有一个类型错误,如果你想要这个表达式有效,它应该有readArray :: [Int] -> String类型:

(showResults . maxSeqLength . readArray . readNQ)