В этом случае я бы использовал data
повсеместно по нескольким причинам.Во-первых, для соответствия случаям с несколькими аргументами (которые определенно должны быть data
, а не newtype
).
Во-вторых, и самое главное, newtype
имеет различная семантика до data
!Конструктор newtype
является строгим, в отличие от конструкторов data
, которые не являются строгими, если вы явно не используете строгие поля.Даже если вы не заботитесь о строгости, или все поля ваших data
являются строгими, все же есть некоторые тонкие различия .
Я не думаю, что один конструктортипы с одним аргументом data
являются бесполезными - синтаксически, они такие же легкие, как newtype
, и семантически кажутся мне более важными.
Вы сказали, что не беспокоитесь о производительности,но если накладные расходы во время выполнения для data
были действительно неудобными, то вы можете смешивать их, если вы знаете о семантических различиях.Однако, если вы используете -funbox-strict-fields
, то GHC может оптимизировать для вас одиночный конструктор с одним аргументом data
s, если они встречаются как строгие поля в других типах данных.
Обычновы должны использовать newtype
при переносе существующего типа в целях безопасности / абстракции во время компиляции или для определения ваших собственных экземпляров, и использовать data
всякий раз, когда тип просто состоит из одногополе, а не оболочка.