дерево на типах:
(a, b) где a или б - это (c, d), т.е какая угодно вложенность кортежей с полиморфными типами c d.
Вот мой код, скину еще и функцию на всякий случай на реверсинг ветвей:
data Node a b = Node (a, b) | (b, a)
newType Bintree = Bintree (Node, Node)
reverseBinTree :: Bintree a -> Bintree a
reverseBinTree (a, b) = reverseBinTree (b, a)
reverseBinTree a = a
Вообщем, происходит следующая ошибка при попытке компайла:
Illegal binding of built-in syntax: (,)
|
3 | data Node a b = Node (a, b) | (b, a)
Можете, пожалуйста, направить на верную сторону, как лучше такую структуру выразить типами?
У каждого варианта должен быть конструктор. Что-то в духе data Node a b = Node1 (a,b) | Node2 (b,a) Конструктор нужен для конструирования значения из его "частей". Если у вас несколько способов это сделать, у каждого должен быть свой уникальный конструктор И дальше в Bintree, кажется, может быть не то, что вы подразумеваете ;)
Спасибо! Как-то проморгал, что он снова ругается на отсутствие конструктора. Я ранее уже пытался описать ноду так: data Node a b = (a, b) думая, что он по умолчанию возьмет идентификатор Node, если отсутствует явный конструктор :)
это компилятор не угадывает. хотя мне тоже хочется, чтобы угадывал
Обсуждают сегодня