【问题标题】:Replacing empty lists with a value用值替换空列表
【发布时间】:2015-06-26 12:47:33
【问题描述】:

我有一个返回这样一个列表的函数:

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

【问题讨论】:

    标签: list haskell replace


    【解决方案1】:

    l 中将xs 替换为ys

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

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 您是否尝试编译 cmets 中的最后一个函数?你应该得到一个范围错误。 ;)
      • 哦对了,我在火车上写的,没查。
      【解决方案3】:

      考虑一下,如果您有一个函数 foo 可以将 [] 转换为 [0] 并返回所有其他未触及的列表,那么 map foo 是您想要的最终函数。

      【讨论】:

        猜你喜欢
        • 2021-06-16
        • 2018-01-31
        • 2020-03-31
        • 1970-01-01
        • 2015-11-22
        • 1970-01-01
        • 2011-02-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多