Parsing Haskell中大型矩阵的解析

Parsing Haskell中大型矩阵的解析,parsing,haskell,matrix,parsec,Parsing,Haskell,Matrix,Parsec,我最近开始学习Haskell,我正在使用Google KickStart代码challanges测试所学内容 我所看到的基本上是从标准输入中读取方阵,并对平行于主对角线的对角线上的元素求和。 我已经写了一个简单的程序来解决这个问题,它通过了第一次测试,但没有通过第二次。 问题似乎是第二个测试中的输入比第一个测试中的输入大得多,并且我编写的解析器要么太慢,要么占用太多内存 输入被格式化为矩阵序列 n a11 ... a1n ... an1 ... ann 我第一次尝试使用内置函数 类型矩阵=[[

我最近开始学习Haskell,我正在使用Google KickStart代码challanges测试所学内容

我所看到的基本上是从标准输入中读取方阵,并对平行于主对角线的对角线上的元素求和。 我已经写了一个简单的程序来解决这个问题,它通过了第一次测试,但没有通过第二次。 问题似乎是第二个测试中的输入比第一个测试中的输入大得多,并且我编写的解析器要么太慢,要么占用太多内存

输入被格式化为矩阵序列

n
a11 ... a1n
...
an1 ... ann
我第一次尝试使用内置函数

类型矩阵=[[Int]]
parseInput::String->[矩阵]
parseInput=parseInput'。线
哪里
parseInput'::[String]->[Matrix]
解析输入'[]=[]
parseInput'(i:is)=let(m,rest)=splitAt(read i)在
(map((map read.words)m):(parseInput'rest)
main=do
输入解析器a
matrixSize=do

n您使用的是哪种
Matrix
类型?如果你能提供一个完整的例子,我们可以编译,运行,然后尝试优化,这会很有帮助。我们能得到进入谷歌网站的准确指针吗?另外,您使用的是哪种数字类型?如果用Haskell链表表示双精度矩阵,则每个数字至少需要16个字节(IEEE-FP64+向下指针)。使用最少的工作示例进行更新,并链接到问题。我将首先尝试三件事,不按特定顺序:使用基于
ByteString
的解析器(如attoparsec)不要使用基于
字符串的字符串,而是完全避免
读取
,并将该操作移动到解析器中,直接解析为总和而不是中间矩阵。1000x1000仅为一百万。几乎可以肯定,懒惰问题是主要问题。它们足够好,可以提前告诉您大小,尝试将值存储在一个未绑定的数组中。(或者根本不存储它们,只需使用一行累加器,在矩阵的每行中旋转累加器即可。)