LINUX.ORG.RU

Операторы конкатенации контейнеров - Haskell

 


0

2

Потратил очень много времени, и никак не могу реализовать операторы конкатенации двух контейнеров:

(+||+) :: 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 ночи все сдать нужно, не знаю что делать =(

Всё ж написано: не все случаи покрыл в (+|+) — точнее, покрыл только один.

Softwayer ★★
()

Я не знаю, что это за хрень, но похоже что можно объединить это в один тип и написать для него полугруппу и, возможно, моноид.

hateyoufeel ★★★★★
()

Не-а. Домашние задания самому надо делать.

Miguel ★★★★★
()
Ответ на: комментарий от hateyoufeel

Похоже, тут два типа намеренно сделано: Cls1 - список из чётного числа элементов, Cls2 из нечётного.

NeXTSTEP ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.