簡體   English   中英

Haskell Io字符串轉換

[英]Haskell Io string conversion

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類型。 我不想一直使用monad。

努力讀懂你的想法:

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

我假設你的聲明是使用monadic版本的列表......我不太確定。 您需要提供有關類型的更多詳細信息,例如readData,fp等。

事實是你無法真正“擺脫”IO。 但是,當你剛接觸Haskell時,這似乎不是問題。 看看主要的類型:

main :: IO ()

您的整個程序 - 或任何程序確實 - 是一個被評估的大型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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM