Подтвердить что ты не робот

Ненужное жонглирование типа для определения Data.Void(пакет "void" в Hackage)?

Пакет void утверждает, что он предоставляет неживой тип под названием Void, который определяется следующим образом -

newtype Void = Void Void

Как это определение лучше, чем использование чего-то более простого? Скажем -

data Void

Если мое понимание верное, оба типа данных содержат только нижние значения. Однако последнее гораздо легче понять.

РЕДАКТИРОВАТЬ: Хорошо, поэтому я понимаю, что Даниэль ответил ниже. Однако я думал о другом, возможно, более простом способе сделать это, оставаясь совместимым с Haskell98. Мы можем использовать абстрактный тип данных и не предоставлять пользователю никаких конструкторов.

module Data.Void (Void) where
  data Void = Void

Теперь только код в модуле Data.Void может построить Void, однако, поскольку мы знаем, что это не так, тип данных Void является фактически необитаемым.

Будет ли это работать, или я что-то пропустил здесь?

4b9b3361

Ответ 1

Из описания для пакета void на Hackage: "A Haskell 98 логически неизученный тип данных" (мой акцент). Объявление Void как простого data Void потребует либо языка Haskell 2010, либо расширения языка "EmptyDataDecls" и, следовательно, не будет "Haskell 98".

ИЗМЕНИТЬ

Вот страница на Haskell Wiki, которая описывает именно эту ситуацию.

Ответ 2

Ваша реализация по-прежнему неполна, потому что у вас нет абсурдной функции:

absurd :: Void -> a

Предполагается, что Void является исходным объектом в Haskell, поэтому вам нужна абсурдная функция. Я считаю, что реализация абсурдного в пакете void очень элегантна и уместна:

absurd (Void a) = absurd a

Это определение напоминает логическую аналогию Void с ложной предпосылкой, из которой можно вывести любой вывод. Он даже использует логическую ошибочность ссылки на себя, чтобы доказать себя, что логически... абсурдно.