繁体   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