2016-04-06 35 views
-1

我想爲兩個圖像創建一個聯合函數(使用字符串類型的列表創建)。我已經開始創建一個unionList函數,該函數組合了兩個列表。Haskell:改進列表union

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的列表,並使用模式匹配(在列表和「字符」文字上)。如果你不明白我的意思,Google「模式匹配haskell」。然後添加更多的案例(以匹配空列表)和對'unionList'的遞歸調用來支持任意長度的列表。 – jberryman

+3

看看'zipWith'。 –

+0

@ReinHenrichs - 我看着zipWith並將其用於圖像聯合。但我想讓unionList函數按照上面的定義工作,並在zipWith中使用它。 – evian1

回答

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 
+0

它用於UnionList函數。我將如何包含這個圖像聯合功能。 (有問題編輯) – evian1

+0

我編輯了我的答案,包括你編輯的問題,這是你在找什麼? –