Потратил очень много времени, и никак не могу реализовать операторы конкатенации двух контейнеров:
(+||+) :: Cont1 a -> Cont1 a -> Cont1 a,
(+|+) :: Cont2 a -> Cont2 a -> Cont1 a,
(+>+) :: Cont2 a -> Cont1 a -> Cont2 a и
(+<+) :: Cont1 a -> Cont2 a -> Cont2 a, следующим образом:
GHCi> let tCnt1 = Cls1 1 2 (Cls1 3 4 Empty)
GHCi> let tCnt2 = Cls2 5 (Cls1 6 7 Empty)
GHCi> tCnt1 +||+ tCnt1
Cls1 1 2 (Cls1 3 4 (Cls1 1 2 (Cls1 3 4 Empty)))
GHCi> tCnt2 +|+ tCnt2
Cls1 5 6 (Cls1 7 5 (Cls1 6 7 Empty))
GHCi> tCnt2 +>+ tCnt1
Cls2 5 (Cls1 6 7 (Cls1 1 2 (Cls1 3 4 Empty)))
GHCi> tCnt1 +<+ tCnt2
Cls2 1 (Cls1 2 3 (Cls1 4 5 (Cls1 6 7 Empty)))
можно часть из этих операторов реализовывать, используя другие.
Мое решение:
data Cls1 a = Empty | Cont1 a a (Cls1 a) deriving (Eq,Show)
data Cls2 a = Cont2 a (Cls1 a) deriving (Eq,Show)
infixr 5 +||+, +|+, +>+, +<+
(+||+) :: Cls1 a -> Cls1 a -> Cls1 a
(+||+) (Empty) (Cont1 a1 b1 c1)= Cont1 a1 b1 c1
(+||+) (Cont1 a0 b0 c0) (Empty)= Cont1 a0 b0 c0
(+||+) (Empty) (Empty)= Empty
(+||+) (Cont1 a0 b0 c0) (Cont1 a1 b1 c1)= Cont1 a0 b0 (c0 +||+ (Cont1 a1 b1 c1))
(+>+) :: Cls2 a -> Cls1 a -> Cls2 a
(+>+) (Cont2 a0 b0) (Cont1 a1 b1 c1) = Cont2 a0 (b0 +||+ (Cont1 a1 b1 c1))
(+|+) :: Cls2 a -> Cls2 a -> Cls1 a
(+|+) (Cont2 a0 (Cont1 a01 b01 (Cont1 a11 b11 c11))) (Cont2 a1 b1) = Cont1 a0 a01 (Cont1 b01 a11 (Cont1 b11 a1 b1))
(+<+) :: Cls1 a -> Cls2 a -> Cls2 a
(+<+) (Cont1 a0 b0 (Cont1 a01 b01 c01)) (Cont2 a1 b1) = Cont2 a0 (Cont1 b0 a01 (Cont1 b01 a1 b1))
тестирующая система пишет следующее:
Failed test #1. Run time error:
main: main.hs:49:1-116: Non-exhaustive patterns in function +|+
Помогите пожалуйста! Мне до 12 ночи все сдать нужно, не знаю что делать =(