我想为两个图像创建一个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
答案 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