Size: a a a

2020 July 09

IK

Ilya Kos in Haskell
Отличаются они только тем, что newtype больше оптимизирован в рантайме
источник

IK

Ilya Kos in Haskell
Там оптимизации как раз за счёт того что там может быть ровно одно поле
источник

ХЛ

Хороший Лисичко... in Haskell
Хмк
источник

ХЛ

Хороший Лисичко... in Haskell
Спасибо, пожалуй
источник

AO

Artem Ohanjanyan in Haskell
Ilya Kos
Для программиста newtype и data с точки зрения использования это одно и то же
newtype до whnf не вычисляется на каждый pattern matching
источник

IK

Ilya Kos in Haskell
Artem Ohanjanyan
newtype до whnf не вычисляется на каждый pattern matching
Ну это уже совсем детали
источник

AO

Artem Ohanjanyan in Haskell
Кроме каких-то не очень частых случаев одно и то же, да
источник

֍֎

֍ ֎ in Haskell

type String = [Char]
newtype NewString = NewString [Char]

String и [Char] взаимозаменяемы :

map toLower :: [Char] -> String

[Char] на NewString так просто не заменишь.

Но в рантайме они выглядят одинаково.
источник

ЗП

Зигохистоморфный Пре... in Haskell
֍ ֎

type String = [Char]
newtype NewString = NewString [Char]

String и [Char] взаимозаменяемы :

map toLower :: [Char] -> String

[Char] на NewString так просто не заменишь.

Но в рантайме они выглядят одинаково.
coerce =)
источник

ЗП

Зигохистоморфный Пре... in Haskell
newtype еще полезен, когда хочешь какой-то из инстансов тайпкласса переопределить
источник

к

кана in Haskell
Хороший Лисичко
Мне из wiki показалось, что это почти type
так, самое главние, ни в коем случае не сравнивай newtype с data, синтаксическая схожесть - ловушка, newtype это как type, только получается новый номинальный тип (а как следствие - инстансы оригинального типа забываются и можно определить свои)

newtype A = FromX X
fromX = FromX
fromA (FromX x) = x

A этот тот же X, но компилятор в компайлтайме будет их различать и не давать перепутать (в рантайме он это уже забудет). FromX в данном случае это не конструктор, а явный маркер для компилятора поменять нормальный тип (ничего не делая в рантайме при этом).

Фразы вида "newtype это как data только оптимизированный" может конечно формально и верны, но только буквой а не духом, и от этого заблуждения лучше избавиться сразу же, newtype это не оптимизированный data, newtype вообще не создает новых типов (в том смысле в котором data создает), просто дает новую номинальность другому типу.

Чтобы еще лучше понять, можно переписывать newtype в другой синтаксис

opaque type A = X
fromA :: A -> X
fromA = id
fromX :: X -> A
fromX = id
-- и в других модулях A и X уже абсолютно разные типы, и для конвертации можно делать только fromA/fromX

Имеет такой же синтаксис как data просто потому что разрабы языка решили не придумывать новый синтаксис и переиспользовать синтаксис конструкторов, что имхо не очень хорошая идея, из-за которой newtype сравнивают с data (а кроме синтаксиса ничего общего и нет).

То есть как теоретическое решение в вакууме это конечно прикольно что можно не делать новый синтаксис, а синтаксис конструтора (который можно использовать и для конструирования, и матчинга) использовать как метку для компиятора (которую как раз нужно использовать в обе стороны), но на практике вот приводит к вот таким заблуждениям что "newtype это как data, но с одним конструктором и оптимизированный"
источник

ХЛ

Хороший Лисичко... in Haskell
кана
так, самое главние, ни в коем случае не сравнивай newtype с data, синтаксическая схожесть - ловушка, newtype это как type, только получается новый номинальный тип (а как следствие - инстансы оригинального типа забываются и можно определить свои)

newtype A = FromX X
fromX = FromX
fromA (FromX x) = x

A этот тот же X, но компилятор в компайлтайме будет их различать и не давать перепутать (в рантайме он это уже забудет). FromX в данном случае это не конструктор, а явный маркер для компилятора поменять нормальный тип (ничего не делая в рантайме при этом).

Фразы вида "newtype это как data только оптимизированный" может конечно формально и верны, но только буквой а не духом, и от этого заблуждения лучше избавиться сразу же, newtype это не оптимизированный data, newtype вообще не создает новых типов (в том смысле в котором data создает), просто дает новую номинальность другому типу.

Чтобы еще лучше понять, можно переписывать newtype в другой синтаксис

opaque type A = X
fromA :: A -> X
fromA = id
fromX :: X -> A
fromX = id
-- и в других модулях A и X уже абсолютно разные типы, и для конвертации можно делать только fromA/fromX

Имеет такой же синтаксис как data просто потому что разрабы языка решили не придумывать новый синтаксис и переиспользовать синтаксис конструкторов, что имхо не очень хорошая идея, из-за которой newtype сравнивают с data (а кроме синтаксиса ничего общего и нет).

То есть как теоретическое решение в вакууме это конечно прикольно что можно не делать новый синтаксис, а синтаксис конструтора (который можно использовать и для конструирования, и матчинга) использовать как метку для компиятора (которую как раз нужно использовать в обе стороны), но на практике вот приводит к вот таким заблуждениям что "newtype это как data, но с одним конструктором и оптимизированный"
ТЕ моё сравнение таки верное?
источник

ХЛ

Хороший Лисичко... in Haskell
кана
так, самое главние, ни в коем случае не сравнивай newtype с data, синтаксическая схожесть - ловушка, newtype это как type, только получается новый номинальный тип (а как следствие - инстансы оригинального типа забываются и можно определить свои)

newtype A = FromX X
fromX = FromX
fromA (FromX x) = x

A этот тот же X, но компилятор в компайлтайме будет их различать и не давать перепутать (в рантайме он это уже забудет). FromX в данном случае это не конструктор, а явный маркер для компилятора поменять нормальный тип (ничего не делая в рантайме при этом).

Фразы вида "newtype это как data только оптимизированный" может конечно формально и верны, но только буквой а не духом, и от этого заблуждения лучше избавиться сразу же, newtype это не оптимизированный data, newtype вообще не создает новых типов (в том смысле в котором data создает), просто дает новую номинальность другому типу.

Чтобы еще лучше понять, можно переписывать newtype в другой синтаксис

opaque type A = X
fromA :: A -> X
fromA = id
fromX :: X -> A
fromX = id
-- и в других модулях A и X уже абсолютно разные типы, и для конвертации можно делать только fromA/fromX

Имеет такой же синтаксис как data просто потому что разрабы языка решили не придумывать новый синтаксис и переиспользовать синтаксис конструкторов, что имхо не очень хорошая идея, из-за которой newtype сравнивают с data (а кроме синтаксиса ничего общего и нет).

То есть как теоретическое решение в вакууме это конечно прикольно что можно не делать новый синтаксис, а синтаксис конструтора (который можно использовать и для конструирования, и матчинга) использовать как метку для компиятора (которую как раз нужно использовать в обе стороны), но на практике вот приводит к вот таким заблуждениям что "newtype это как data, но с одним конструктором и оптимизированный"
Спасибо
источник

KV

Kirill Valyavin in Haskell
Process exited with code: ExitFailure (-6)
Что это за -6? Как прогуглить? Кого винить?
источник

AP

Aleksei (astynax) Pi... in Haskell
Коды возврата определяет программист
источник

AP

Aleksei (astynax) Pi... in Haskell
Никаких особых соглашений нет на эту тему. Только "0 == Ок"
источник

KV

Kirill Valyavin in Haskell
Aleksei (astynax) Pirogov
Коды возврата определяет программист
Ну это GHC даёт. Спросить программистов GHC?
источник

LO

Leonid 🦇 Onokhov in Haskell
Aleksei (astynax) Pirogov
Коды возврата определяет программист
Не только
источник

LO

Leonid 🦇 Onokhov in Haskell
Если ОС убила то на линуксе это сигнал которым убило
источник

AP

Aleksei (astynax) Pi... in Haskell
Kirill Valyavin
Ну это GHC даёт. Спросить программистов GHC?
тогда об этом должно быть написано в доке
источник