Разница между `newtype` и` data` с аннотацией строгости - PullRequest
0 голосов
/ 20 ноября 2018

Как этот код

data D = D { _d :: ![P] } -- Note the strictness annotation!

Сравнить с этим

newtype D = D { _d :: [P] }

ответ на связанный вопрос говорит:

основное различие между данными и newtype заключается в том, что с данными конструкторы данных ленивы, а newtype строгое

Как это различие работает, когда версия data имеет аннотацию строгости?

(вопрос основан на реальном коде, на который я наткнулся)

1 Ответ

0 голосов
/ 20 ноября 2018

Например,

case undefined of
   D d -> "hello"

выдаст ошибку для data типов (строгих или не строгих), но оценит "hello" для новых типов.

Это потому, чтово время выполнения применение конструктора newtype или сопоставление с ним не соответствует ни одной операции.Даже не навязывая значение, которое мы case определяем.

В отличие от этого, сопоставление с образцом в конструкторе data всегда вызывает значение, на которое мы case.

Я думаю, что это единственноеразница во времени выполнения между строгими data и newtype.Существуют некоторые статические различия, такие как некоторые расширения GHC, которые влияют только на newtype, Coercible и т. Д., Но во время выполнения эти два типа изоморфны (но сопоставление с образцом работает по-разному, как показано выше).

...