2011-06-18 38 views
0
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退货。这是木卫一字符串列表

但现在我想借此从该列表中第一和第三个元素,并用了木卫一类型返回

(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]] 
) 

。我不想一直使用monad。

+0

THX ATM我现在该怎么做, – XYZ

回答

1

在读你的头脑愚蠢的尝试:

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

我假设你做的语句用列表的单子版本......我不太清楚。你需要给的类型的详细信息,例如READDATA,FP的等

+0

我写COMENT我纠正问题。在monada IO中,我需要在返回之前运行obrob,并且它将起作用 – XYZ

+0

@XYZ该语句没有任何意义。在返回前运行一些东西从什么时候开始在Haskell中“运行”? – alternative

1

事实是,你不能真正“甩掉”的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