Haskell Io преобразование строк - PullRequest
0 голосов
/ 18 июня 2011
obrob fp =  do
    a <- [(!!) readData fp 0]
    b <- [(!!) readData fp 2]
   return a --(read a :: Int ,read b::[[Int]] )

Я читаю данные из файла, который я получаю

["6",
 "",
 "[[1,2,3,4,5,6],[7,8,9,10,11,12],[13,14,15,16,17,18],[19,20,21,22,23,24],[25,26,27,28,29,30],[31,32,33,34,35,36]]"
]

readData возвращает это. Это список строк IO

Но теперь я хочу взять первый и третий элемент из этого списка и вернуть

(6,
 [[1,2,3,4,5,6],[7,8,9,10,11,12],[13,14,15,16,17,18],[19,20,21,22,23,24],[25,26,27,28,29,30],[31,32,33,34,35,36]]
)

без типа Io. Я не хочу использовать монаду все время.

Ответы [ 2 ]

1 голос
/ 19 июня 2011

Правда в том, что вы не можете "избавиться" от IO. Но это не та проблема, которой кажется, когда вы новичок в Haskell. Посмотрите на тип основного:

main :: IO ()

Вся ваша программа - или любая другая программа на самом деле - это большое действие ввода-вывода, которое оценивается. На этом пути мы пытаемся сделать много чистых вычислений.

Как насчет этого (и мои извинения, если это только запутывает проблему):

-- Simulate your file read operation
readData :: IO [String]
readData = return ["6","","[[1,2,3,4,5,6],[7,8,9,10,11,12],
    [13,14,15,16,17,18],[19,20,21,22,23,24],[25,26,27,28,29,30],
    [31,32,33,34,35,36]]"]


-- pure function - not IO
someOtherFunction (x, ys) = (x > 0, length ys)


obrob :: IO (Bool, Int)
obrob = do
   -- Pattern match out the 1st and 3rd elements
   (a:_:b:_) <- readData

   -- t is the tuple you're trying to get to
   let t = ((read a) :: Int, (read b) :: [[Int]])
   print t 

   -- And inside this do block, that t is not in IO.
   -- Lets pass it to a pure function:
   let u = someOtherFunction t

   -- Later we have to evaluate to something in IO.
   -- It cannot be escaped.
   return u
1 голос
/ 18 июня 2011

Слабая попытка прочесть ваши мысли:

obrob fp :: Integral i, Read i => (i, [[i]])
obrob fp = let xs = readData fp
           in (read $ readData fp !! 0, read $ readData fp !! 2)

Я предполагаю, что ваше утверждение do использовало монадическую версию списка ... Я не совсем уверен.Вам необходимо предоставить более подробную информацию о типах, например readData, fp и т. Д.

...