Как правильно использовать конструкторы пользовательских типов данных?

Я написал свой тип данных:

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.

Я уже импортировал модуль с древовидным типом

Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
1
0
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Конструктор типа — это Tree, то есть для создания типа, а не данных. Конструкторы данных здесь — это Leaf и Node, поэтому они используются для создания объектов. Конструкторы типов и конструкторы данных могут иметь одно и то же имя, но поскольку «мир типов» и «мир значений» (на самом деле) не взаимодействуют, это не создает путаницы для компилятора.

Таким образом, здесь вы можете использовать Leaf или Node. Здесь Leaf единственная смысловая вещь, поэтому:

emptyTree:: Tree a
emptyTree = Leaf

Но вы можете использовать Leaf в любом месте кода, поэтому определять это не нужно.

Есть ли проблема, если я передам результат этой функции функции, которая ожидает дерево?

student422 20.11.2022 01:51
Data constructor not in scope: Leaf :: Tree a | 8 | emptyTree = Leaf | ^^^^ И я тоже это понимаю ;(
student422 20.11.2022 01:53

@student422: вы уверены, что не используете другой тип Tree, например, из модуля Data.Treehackage.haskell.org/package/containers-0.6.6/docs/…

Willem Van Onsem 20.11.2022 01:57

@student422: вы можете использовать emptyTree и Leaf для любой части выражения, которая ожидает значение типа Tree a.

Willem Van Onsem 20.11.2022 01:57

Другие вопросы по теме