2015-12-04 2 views
3

Давайте, что у меня есть два псевдонима типа:Как "брошенные" Типы профсоюзов вяз

type alias A = {...} 
type alias B = {...} 

и объединение типа

type Content = A | B 

и тип модели

type alias Model= {cont : Content, ...} 

init : Content -> Model 
init cont = {cont = cont, ...} 

Как Я передаю запись типа A в init.

a : A 
a = {...} 
init a 

выдает следующее сообщение об ошибке:

Detected errors in 1 module. 
## ERRORS in Main.elm ########################################################## 

-- TYPE MISMATCH ------------------------------------------------------ Main.elm 

The 1st argument to function `init` has an unexpected type. 

78|    init e 
        ^
As I infer the type of values flowing through your program, I see a conflict 
between these two types: 

    Content 

    A 

Я бы себе представить, что это своего рода «подтипа» Контента. Я не могу просто написать

a:Content 
a = {...} 
init a 

, потому что некоторые из логики делают случай анализ на содержание

+0

Являются псевдонимами типа А и В, а также определение содержания в тот же модуль? Это не компиляция с ошибкой Duplicate Definition. –

+0

Они не в том же модуле, но я ссылаюсь на 'type Content = modulename.A | modulename.B'. Проблема в том, что эти типы не могут быть действительно подключены к модулю. Я мог бы сделать какой-то прокси-тип, я полагаю. Как вы думаете? –

ответ

6

типа профсоюза Elm является так называемыми дискриминируемых союзами (или помеченными союзов). Дискриминационная часть - это тег или конструктор. В этом случае я думаю, что вы хотите:

type Content = TagA A | TagB B 

Обратите внимание, что первое капитализируются имя тега, и что-нибудь еще другие типы или тип переменных.

Теперь вы можете сделать:

a : A 
a = { ... } 
init (TagA a) 

В init можно выделить два типа, выполнив:

init content = 
    case content of 
    TagA a -> ... 
    TagB b -> ... 
Смежные вопросы