проверка типа псевдонима типа elm не происходит, почему он компилируется? - PullRequest
1 голос
/ 12 апреля 2020

Следующий код имеет два псевдонима типа Name и Surname.

В идеале я думаю, что это не должно компилироваться. Почему он компилируется?

Произойдет ли замена типов до того, как будет задействована проверка типов?

import Html

type alias Name = String
type alias Surname = String

namePrinter : Name -> Name 
namePrinter n =
  n

k : Name
k = "kaba"

j : Surname
j = "jaja"


main =
  Html.text ( "Hello!" ++ namePrinter k ++ namePrinter j )

1 Ответ

6 голосов
/ 12 апреля 2020

Псевдоним типа - это просто другое имя типа. Это не другой тип.

Вы можете создать отдельный тип, обернув его в пользовательский тип, однако:

type Name = Name String
type Surname = Surname String

Но тогда вам также придется создавать и деконструировать его:

namePrinter : Name -> String 
namePrinter (Name n) =
  n

k : Name
k = Name "kaba"

j : Surname
j = Surname "jaja"

И тогда это не удастся скомпилировать:

main =
  Html.text ( "Hello!" ++ namePrinter k ++ namePrinter j )

Кроме того, если вы определяете этот тип в отдельном модуле и не экспортируете его конструктор (ie. Just Name вместо Name(..)) у вас есть то, что называется непрозрачный тип , который может быть полезен для принудительного применения инвариантов, которые не может система типов. Например, вы можете принудить, чтобы целое число не могло быть отрицательным.

...