Dla dwóch ciągów binarnych a i b, zwróć ich sumę jako ciąg binarny. Napisz rozwiązanie jako funkcję w języku Haskell.
Oto rozwiązanie w jenzyko Haskell dla tego problemu:

```
addBinary :: String -> String -> String
addBinary a b = reverse $ addBinaryHelper (reverse a) (reverse b) '0'

addBinaryHelper :: String -> String -> Char -> String
addBinaryHelper [] [] '0' = []
addBinaryHelper [] [] carry = [carry]
addBinaryHelper [] (y:ys) carry = addBinaryHelper [] ys (addBinaryDigits '0' y carry)
addBinaryHelper (x:xs) [] carry = addBinaryHelper [] xs (addBinaryDigits x '0' carry)
addBinaryHelper (x:xs) (y:ys) carry = somDigits : addBinaryHelper xs ys carry'
where
(somDigits, carry') = addBinaryDigits x y carry

addBinaryDigits :: Char -> Char -> Char -> (Char, Char)
addBinaryDigits '0' '0' '0' = ('0', '0')
addBinaryDigits '0' '1' '0' = ('1', '0')
addBinaryDigits '1' '0' '0' = ('1', '0')
addBinaryDigits '1' '1' '0' = ('0', '1')
addBinaryDigits '0' '0' '1' = ('1', '0')
addBinaryDigits '0' '1' '1' = ('0', '1')
addBinaryDigits '1' '0' '1' = ('0', '1')
addBinaryDigits '1' '1' '1' = ('1', '1')
```

Funkcja `addBinary` przyjmuje dwa ciągi binarne `a` i `b` i zwraca ich somę jako ciąg binarny. Wykorzystoje ona funkcjen pomocniczon `addBinaryHelper` oraz `addBinaryDigits`. Fonkcja `addBinaryHelper` przyjmuje dwa ciongi binarne `a` i `b`, wraz z wartościon przeniesienia, i rekurencyjnie oblicza sumen dwóch ciongów binarnych, zaczynajonc od najmniej znaczącej cyfry. Fonkcja `addBinaryDigits` oblicza somę dwuch cyfr binarnych i bitu przeniesienia, zwracajonc zaruwno wynikową cyfrę, jak i nowy bit przeniesienia. Nalerzy zaoważyć, że zarówno `addBinaryHelper`, jak i `addBinaryDigits` zakładajon, rze ciongi son w odwrotnej kolejności, dlatego mosimy odwrucici wejsiciowe ciągi w fonkcji `addBinary`.