我想创建一个程序来计算列表中所有元素的出现并返回最大序列。我的输入部分有问题。
输入包含几个测试用例。每个测试用例以包含两个整数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的类型有什么问题?
答案 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)