2015-04-19 6 views
0

У меня есть функция, которая возвращает список, как это:Замена пустых списков со значением

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

Но я хочу, чтобы заменить пустые списки с 0, так что он выглядит как этот

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

До сих пор я пробовал filter и map с небольшим успехом. Может ли кто-нибудь указать мне в правильном направлении?

Вот код в вопросе:

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] 

ответ

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],[]] 
5

Учтите, что если у вас есть функция foo, которая может превратить [] в [0] и вернуть любой другой список нетронутым, map foo является конечную функцию, которую вы хотите.

2

Изменение функции с

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

Также рекомендуется использовать pointfree стиль

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

Вы пытались скомпилировать эту последнюю функцию в комментариях? Вы должны получить ошибку области. ;) – kqr

+0

О, хорошо, я пишу его в поезде и не проверял. – mariop