用值替换空列表

时间:2015-04-19 23:08:21

标签: list haskell replace

我有一个返回如下列表的函数:

[ [1, 2, 3], [], [5], [5,6], []]

但是我想用0替换空列表,所以它看起来像这样

[ [1, 2, 3], [0], [5], [5,6], [0]]

到目前为止,我已尝试filtermap但收效甚微。有人可以指出我正确的方向吗?

以下是相关代码:

knightPlace:: [Int] -> [[Int]]
knightPlace n = makeboard n

    where
    makeboard n =  [x | i<-[0..(length n -1 )], x <- [checkPos i]]
    -- checkPos add zero
    checkPos i = [j+1 | j<-[0..(length n -1 )], queenFilter n i j]
    -- filters all rows, cols and diags, also knights
    queenFilter n i j = and [n!!(i) == 0 && n!!(k) /=(j+1) && (n!!(k)==0 || (abs(n!!(k)-(j+1))/=abs(i-k))) && (n!!(k)==0 ||not( ((abs(i-k)==2)&& (abs(n!!(k)-(j+1))==1)) ||((abs(i-k)==1)&& (abs(n!!(k)-(j+1))==2))))       | k<-[0..(length n - 1)] ]

被称为

 knightPlace [0, 0, 6, 0, 0, 4, 0, 0]

3 个答案:

答案 0 :(得分:5)

如果你有一个函数foo可以将[]转换为[0]并返回其他所有列表,那么map foo就是你想要的最终函数。< / p>

答案 1 :(得分:2)

使用

更改您的功能
knightPlace n = map (\x -> if null x then [0] else x) $ makeboard n

还要考虑使用无点样式

knightPlace = map (\x -> if null x then [0] else x) . makeboard

答案 2 :(得分:2)

xs替换为ys中的l

replaceWith :: [a] -> [a] -> [[a]]
replaceWith xs ys l = map (\x -> if x == xs then ys else x) l

在这种情况下,

replaceWith [] [0] [[1, 2, 3],[],[5],[5,6],[]]