2016-06-20 3 views
3

В проекте я работаю с коллегой, мы usign в UrlParser модуль и мы наткнулись на эту ошибку:Бесконечность в Элм

The type annotation for ourParser does not match its definition. 

The type annotation is saying: 

    UrlParser.Parser a a 

But I am inferring that the definition has this type: 

    UrlParser.Parser (String -> ∞) (String -> ∞) 

Hint: A type annotation is too generic. You can probably just switch 
to the type I inferred. These issues can be subtle though, so read 
more about it. 

Наш код что-то вроде

ourParser : UrlParser.Parser a a 
ourParser = 
    UrlParser.oneOf 
     [ UrlParser.s "home" 
     , UrlParser.s "detail" </> UrlParser.string 
     ] 

Главный вопрос: что это такое символ? Где это определено? Если я попытаюсь скопировать/вставить его в определение моей функции, я получаю синтаксическую ошибку, как будто Elm на самом деле не знает, что это за символ ...

Следующий вопрос: как такая ошибка возникает с моим кодом ?

ответ

5

Второй анализатор в списке альтернатив сочетает в себе

UrlParser.s "detail" : Parser a a 
UrlParser.string  : Parser (String -> b) b 

использованием

(</>) : Parser u v -> Parser v w -> Parser u w 

Как вы, надеюсь увидеть следующие типы должны совпадать:

u ~ a 
v ~ a 
v ~ (String -> b) 
w ~ b 

Результирующий тип

UrlParser.s "detail" </> UrlParser.string : Parser (String -> b) b 

Первый анализатор в списке альтернатив имеет тип

UrlParser.s "home" : Parser c c 

Потому что вы строите список из них, они должны иметь один и тот же общий тип. Таким образом, c ~ (String -> b), но и c ~ b. То, что у вас здесь, представляет собой цикл, приводящий к бесконечному типу . Это означает символ бесконечности.

Текст ошибки действительно вводит в заблуждение, поскольку в системе типа Elm не поддерживаются бесконечные типы (поскольку они не имеют смысла). Это звучит как ошибка, поскольку Элм должен объяснить, что бесконечные типы всегда указывают на ошибку программирования.


documentation for oneOf показывает, как парсеры разных типов могут быть объединены посредством использования format.

В любом случае вам необходимо превратить свой первый парсер в нечто вроде Parser (String -> c) c. Из типов, похоже, применение format "some string" к первому парсеру уже было бы достаточно, но я не знаю достаточно о Elm или UrlParser, чтобы дать какие-либо гарантии об этом.

Смежные вопросы