Haskell:改进列表联合
我想为两个图像创建一个union函数(使用字符串类型的列表创建)。我首先创建了一个结合两个列表的unionList函数Haskell:改进列表联合,haskell,functional-programming,Haskell,Functional Programming,我想为两个图像创建一个union函数(使用字符串类型的列表创建)。我首先创建了一个结合两个列表的unionList函数 unionList :: String -> String -> String unionList xs ys = xs ++ foldl (flip delete) ys xs 这是可行的,但不是我想要的。 我希望它能像这样工作: input = unionList [’ ’,’ ’,’X’,’X’,’ ’] [’X’,’ ’,’X’,’ ’,’X’]
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"]
^例子 应该给我两个图像的并集。
定义为
imgUnion :: Img -> Img -> Img
也许有更好的方法可以做到这一点,但我尝试了几种方法,从中获得了一些乐趣
列表标题项上的模式匹配:
unionList1::String->String->String
unionList1('X':xs)(uiq:ys)='X':unionList1 xs ys
unionList1(uxs:xs)('X':ys)='X':unionList1 xs ys
unionList1(:xs)(:ys)='':unionList1 xs ys
联合列表1
卫兵
unionList2::String->String->String
联合名单2(x:xs)(y:ys)
|x==''=y:剩余
|y=''=x:剩余
|否则=x:休息
其中rest=unionList2 xs ys
unionList2[uU2][]
以及用zipWith
提出的解决方案:
unionList3::String->String->String
unionList3=zipWith(\x y->如果x/='',那么x else y)
然后,可以在图像上使用以下联合函数之一:
imgUnion::[String]->[String]->[String]
imgUnion=zipWith unionList3
main::IO()
main=do
让img1=[“XX”,
“X X”,
“XX”]
img2=[“XX XX”,
“X”,
“XX XX”]
mapM_uuuu计算机网络(imgUnion img1 img2)
作为输出提供:
XXXXX
XX X
XXXXX
从一个只适用于长度为1的列表并使用模式匹配(在列表和Char
literals)的解决方案开始。如果你不明白我的意思,谷歌“模式匹配haskell”。然后添加更多事例(以匹配空列表)并递归调用unionList
,以支持任意长度的列表。查看zipWith
@ReinHenrichs-我查看了zipWith并将其用于图像合并。但是我想首先让unionList函数按照上面的定义工作,并与zipWith一起使用。unionList
是我建议您使用的函数。上面定义的函数是错误的,我不知道如何使它工作,因为它是错误的。请尝试使用zipWith
执行它。我不想给你答案,因为这是家庭作业,它是用于UnionList函数的。我将如何将其包括在图像联合功能中。(问题中的编辑)我编辑了我的答案以包括您编辑的问题,这是您要找的吗?
imgUnion :: Img -> Img -> Img