2016-06-20 4 views
3

In einem Projekt arbeite ich an mit einem Kollegen, sind usign wir das UrlParser Modul und wir in diesem Fehler gestolpert:Unendlichkeitssymbol in Elm

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. 

Unser Code ist so etwas wie

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

Die Hauptfrage ist: Was ist das Symbol? Wo ist es definiert? Wenn ich versuche, es in meiner Funktionsdefinition zu kopieren, bekomme ich einen Syntaxfehler, als ob Elm eigentlich nicht wüsste, was dieses Zeichen ist ...

Die folgende Frage ist: Wie ein solcher Fehler mit meinem Code passiert ?

Antwort

5

Der zweite Parser in der Liste der Alternativen kombiniert

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

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

Wie Sie hoffentlich müssen sehen können, die folgenden Arten zusammenpassen:

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

Die resultierende Typ ist

Der erste Parser in der Liste der Alternativen geben hat

UrlParser.s "home" : Parser c c 

Weil Sie eine Liste dieser Gebäude sind, müssen sie die gleichen allgemeinen Typ. Als solche, c ~ (String -> b), aber auch c ~ b. Was Sie hier haben, ist eine Schleife, die zu einem unendlichen Typ führt. Das ist es, was das Unendlichkeitssymbol bedeutet.

Der Fehlertext ist in der Tat irreführend, weil unendliche Typen in Elms Typsystem nicht unterstützt werden (weil sie keinen Sinn ergeben). Das hört sich nach einem Bug an, wie Elm erklären sollte, dass unendliche Typen immer auf einen Programmierfehler hinweisen.


Die documentation for oneOf zeigt, wie Parser verschiedenen Typen durch die Verwendung von format kombiniert werden könnten.

In jedem Fall müssen Sie Ihren ersten Parser in etwas vom Typ Parser (String -> c) c verwandeln. Von den Typen sieht es so aus, als würde die Anwendung von format "some string" auf den ersten Parser bereits ausreichen, aber ich weiß nicht genug über Elm oder den UrlParser, um irgendwelche Garantien dafür zu geben.