[英]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.