2013-10-10 33 views
0

我不知道我的代碼出了什麼問題,我只想得到一個列表並正確填充它,並返回該列表作爲該函數的結果。你能幫我解決這個問題嗎?列表中的哈斯克爾錯誤

fill [] counter= [] 
fill (x:xs) counter= do 
        (if x==0 
        then do 
         let new =counter+1 
         new:xs 
         fill xs new 
        else 
         fill xs counter) 

我想非重複的數字

main = do 
fill [9,0,9,0,0,0] 0 -- expexted to get [9,1,9,2,3,4] 
+0

你想填寫什麼? – Ryan

+0

我不明白這裏的邏輯。如果你想''1,2,3,4]',使用'[1..4]'。 – Ryan

+0

您是否期待'fill [0,0,0,0] 0 == [0,1,2,3]'? –

回答

2

你正在寫的Haskell,就好像它是一個命令式語言,以填補零。 do塊中的第二個表達式new:xs完全沒有做任何事情。

的做塊之後then

do 
    let new =counter+1 
    new:xs 
    fill xs new 

因爲do S和let 5事實上轉化爲lambda表達式:

let x = a 
b x 

成爲

(\x -> b x)(a) 

,你do塊轉換爲:

(\new -> (\discarded -> fill xs new)(new:xs)) (counter + 1) 

new:xs被丟棄在中間。

符號只有在處理單子時纔有用。否則,它會導致誤導性代碼。

參見:

1

我們可以稍微修改原始版本:

fillZero' (z:zs) y'@(y:ys) = 
     if z == 0 
     then y : fillZero' zs ys 
     else z : fillZero' zs y' 
fillZero' _ _ = [] 

及用途:

fillZero = flip fillZero' [1..] 

> fillZero [0,305,0,0,0,8,0,0] 
[1,305,2,3,4,8,5,6]