2016-04-06 31 views
-1

İki resim için bir sendika işlevi oluşturmak istiyorum (tip dizgisi listeleri kullanılarak oluşturuldu.) İki listeyi birleştiren unionList işlevi oluşturarak başlattım.Haskell: liste birimini iyileştir

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

Bu nasıl çalışır, ama ben de istemiyorum. o bunu başarmak için nasıl yapıldığını üzerinde

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

herhangi fikirler:
nasıl bir şey çalışmak istiyorum.

DÜZENLEME: Nihayetinde iki resmin birleşimini oluşturmaya çalışıyorum.

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

^
örnekler

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

bana iki görüntülerin birliği vermelidir.
imgUnion

imgUnion :: Img -> Img -> Img 
+0

Bir çözümle başlayın. sadece uzunluk 1 listelerinde çalışır ve desen eşleştirmeyi kullanır (listelerde ve "Char" değişmezlerinde). Ne demek istediğimi anlamadıysanız Google "desen eşleme karması". Ardından, daha fazla durum (boş listeye eşleşecek şekilde) ve rasgele uzunluk listelerini desteklemek için "unionList" e özyinelemeli bir çağrı ekleyin. – jberryman

+3

'zipWith''e bakın. –

+0

@ReinHenrichs - zipWith'e baktım ve görüntü birliği için kullanacağım. ama sendikaList işlevini yukarıda tanımlandığı şekilde çalışmaya başlamak ve zipWith ile kullanmak istiyorum. – evian1

cevap

1

bunu yapmak için muhtemelen daha iyi yolları vardır olarak tanımlanan, ancak yöntemlerin bir çift denemek üzere eğlendik. Liste başı öğe üzerinde

Desen eşleştirme:

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

Muhafızları!

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

Ve zipWith ile önerdiği gibi bir çözüm:

XXXXX 
XX X 
XXXXX 
:
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) 

çıktı olarak verir:

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

Daha sonra resmin üzerine bu birlik işlevlerinden birini kullanabilirsiniz

+0

UnionList işlevi içindir. Bunu görüntü sendikası işlevi için nasıl ekleyeceğim. (düzenleyin) – evian1

+0

Düzenlediğim sorunuzu dahil etmek için cevabımı düzenledim, aradığınız şey bu mu? –