Почему `type alias` - это тип, который определен таким же образом в другом модуле? - PullRequest
0 голосов
/ 13 мая 2018

Например, из документации типа Task в модуле Task :

type alias Task err ok =
  Task err ok

Или из источника:

type alias Task x a =
  Platform.Task x a

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


UPDATE:
Чад Гилберт приводит хороший момент, упоминая Platform примитивы , такие как типы Task и ProcessId, конструкторы которых никогда не используются там, но имеет смысл, почему они будут сгруппированы при таком Центральное место. Хотя его ответ не объясняет, почему они имеют псевдонимы в своих соответствующих модулях (см. Process.Id и Task.Task выше).

Я полагаю, что без наложения псевдонимов любой, кто пытается использовать модули Task и Process, должен был бы импортировать эти конкретные типы (т. Е. Platform.Task, Platform.ProcessId), поскольку они не импортируются по умолчанию (см. Импорт по умолчанию вяза ).


UPDATE_2:
Еще один пример - Value в модуле Json.Decode module :

-- From the docs:
type alias Value = 
    Value

-- From the source:
type alias Value = JsEncode.Value

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

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Короче говоря, я думаю, что вы делаете это, когда хотите, чтобы ваш интерфейс был структурирован иначе, чем вы хотите организовать свою реализацию.

Вы можете сделать это по нескольким причинам, например:

  1. Вы хотите выставить один и тот же тип из нескольких модулей, потому что это имеет больше смысла для потребителя вашего пакета. В то же время у вас должна быть одна реализация, потому что это имеет смысл с инженерной точки зрения (как в случае Json.Encode/Decode.Value).

  2. Ваш тип непрозрачен в любом случае (имеется в виду, что конструкторы не отображаются), и вам просто нужно, чтобы он был определен в месте, отличном от того, откуда он должен быть импортирован. Я думаю, что это случай Platform.Task: Эван, по-видимому, хотел организовать все примитивы платформы в одном файле. Однако, с точки зрения потребителя, было бы странно импортировать Platform.elm. Это будет похоже на детали реализации, представленные потребителю библиотеки.

0 голосов
/ 14 мая 2018

Из документации по Platform.Task:

Обратитесь к документации для модуля Task для получения дополнительной информации по этому вопросу.Он определен здесь только потому, что это примитив платформы

Там он определяется как:

type Task err ok = Task

... что на самом деле нам мало что говорит.Task является непрозрачным типом, и его внутренний конструктор Task никогда не используется.Это один из фундаментальных примитивов в архитектуре вяза, и, основываясь на приведенном выше комментарии, кажется, он определен только в Platform, потому что это удобная группа примитивов, ориентированных на платформу.

...