Итак, я прочитал теорию, теперь пытаясь разобрать файл в 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
Меня путают монады (и контекст, в который меня заталкивают!) и оператор do. Я действительно хочу написать что-то подобное, но я знаю, что это неправильно:
firstLine <- contents.head
(m,n) <- map read (words firstLine)
потому что содержимое не является списком, а монадой.
Любая помощь на следующем шаге будет отличной.
Итак, я просто обнаружил, что вы можете сделать:
liftM lines . readFile
чтобы получить список строк из файла. Однако, все же этот пример только преобразует только ENTIRE файл и не использует только первую или вторую строки...