【发布时间】:2012-01-12 01:24:42
【问题描述】:
所以我已经阅读了理论,现在尝试在 Haskell 中解析文件 - 但我没有得到任何结果。这太奇怪了……
这是我的输入文件的外观:
m n
k1, k2...
a11, ...., an
a21,.... a22
...
am1... amn
其中 m,n 只是整数,K = [k1, k2...] 是整数列表,a11..amn 是“矩阵”(列表列表):A=[[a11,...a1n], ... [am1... amn]]
这是我的快速 python 版本:
def parse(filename):
"""
Input of the form:
m n
k1, k2...
a11, ...., an
a21,.... a22
...
am1... amn
"""
f = open(filename)
(m,n) = f.readline().split()
m = int(m)
n = int(n)
K = [int(k) for k in f.readline().split()]
# Matrix - list of lists
A = []
for i in range(m):
row = [float(el) for el in f.readline().split()]
A.append(row)
return (m, n, K, A)
以下是我在 Haskell 中的表现(不是很):
import System.Environment
import Data.List
main = do
(fname:_) <- getArgs
putStrLn fname --since putStrLn goes to IO ()monad we can't just apply it
parsed <- parse fname
putStrLn parsed
parse fname = do
contents <- readFile fname
-- ,,,missing stuff... ??? how can I get first "element" and match on it?
return contents
我对 monads(以及我陷入其中的上下文!)和 do 语句感到困惑。我很想写这样的东西,但我知道这是错误的:
firstLine <- contents.head
(m,n) <- map read (words firstLine)
因为 contents 不是一个列表 - 而是一个单子。
对下一步步骤的任何帮助都会很棒。
所以我只是 discovered 你可以这样做:
liftM lines . readFile
从文件中获取行列表。但是,该示例仍然只转换了整个文件,并且不只使用第一行或第二行...
【问题讨论】:
标签: haskell