2013-10-10 108 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]