2011-06-18 60 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