Я написал свой тип данных:
data Tree a = Leaf | Node a Color (Tree a) (Tree a) deriving (Show)
И я хочу использовать его, но я не понимаю, как. По дизайну я хочу создать функцию, которая возвращает пустое дерево (дерево с Leaf
), но я не понимаю, что я должен передать в конструктор, я пробовал что-то вроде этого:
emptyTree:: Tree a
emptyTree = Tree
Я также получаю следующее предупреждение
Data constructor not in scope: Tree :: t0 -> Tree a • Perhaps you meant ‘True’
P.S.
Я уже импортировал модуль с древовидным типом
Конструктор типа — это Tree
, то есть для создания типа, а не данных. Конструкторы данных здесь — это Leaf
и Node
, поэтому они используются для создания объектов. Конструкторы типов и конструкторы данных могут иметь одно и то же имя, но поскольку «мир типов» и «мир значений» (на самом деле) не взаимодействуют, это не создает путаницы для компилятора.
Таким образом, здесь вы можете использовать Leaf
или Node
. Здесь Leaf
единственная смысловая вещь, поэтому:
emptyTree:: Tree a
emptyTree = Leaf
Но вы можете использовать Leaf
в любом месте кода, поэтому определять это не нужно.
Data constructor not in scope: Leaf :: Tree a | 8 | emptyTree = Leaf | ^^^^
И я тоже это понимаю ;(
@student422: вы уверены, что не используете другой тип Tree
, например, из модуля Data.Tree
hackage.haskell.org/package/containers-0.6.6/docs/…
@student422: вы можете использовать emptyTree
и Leaf
для любой части выражения, которая ожидает значение типа Tree a
.
Есть ли проблема, если я передам результат этой функции функции, которая ожидает дерево?