Haskell:改进列表联合

时间:2016-04-06 15:06:04

标签: haskell functional-programming

我想为两个图像创建一个union函数(使用string类型的列表创建。)我已经开始创建一个结合了两个列表的unionList函数。

unionList :: String -> String -> String  
unionList xs ys =  xs ++ foldl (flip delete) ys xs

这有效但不是我想要的。
我希望它的工作方式如下:

input = unionList [’ ’,’ ’,’X’,’X’,’ ’] [’X’,’ ’,’X’,’ ’,’X’] 
output = "X XXX"

关于如何实现这一目标的任何想法。

编辑:我最终试图创建两个图像的联合。

image 1 = ["  XX  ",     image 2 = ["XX XX",         type Img = [String]
           " X  X ",                "  X  ",
           "  XX  "]                "XX XX"]          

^
示例

Input = (imgUnion (image 1) (image 2))

应该给我两张图片的联合 imgUnion定义为

imgUnion :: Img -> Img -> Img

1 个答案:

答案 0 :(得分:1)

可能有更好的方法可以做到这一点,但我尝试了几种方法,我有一些乐趣。

列表头项目上的模式匹配:

unionList1 :: String -> String -> String
unionList1 ('X':xs) ( _ :ys) = 'X' : unionList1 xs ys
unionList1 ( _ :xs) ('X':ys) = 'X' : unionList1 xs ys
unionList1 ( _ :xs) ( _ :ys) = ' ' : unionList1 xs ys
unionList1     _        _    = []

卫兵!

unionList2 :: String -> String -> String
unionList2 (x:xs) (y:ys)
  | x == ' '   = y : rest
  | y == ' '   = x : rest
  | otherwise  = x : rest
  where rest   = unionList2 xs ys
unionList2 _ _ = []

zipWith建议的解决方案:

unionList3 :: String -> String -> String
unionList3 = zipWith (\x y -> if x /= ' ' then x else y)

然后,您可以在图像上使用其中一个联合函数:

imgUnion :: [String] -> [String] -> [String]
imgUnion = zipWith unionList3

main :: IO ()
main = do
    let img1 = ["  XX  ",
                " X  X ",
                "  XX  "]
        img2 = ["XX XX",
                "  X  ",
                "XX XX"]

    mapM_ putStrLn (imgUnion img1 img2)

作为输出:

XXXXX
 XX X
XXXXX