2016-06-16 3 views
4

Versuchen, herauszufinden, wie die aktuelle Zeit zu bekommen, und ich fand die Methode, aber nicht wissen, wie die Typ-Signatur zu lesen.Elm was ist "x" in einer Typ-Signatur?

Die Signatur ist now : Task x Time Sie können es sehen here.

Ich kann nicht herausfinden, wie man es sucht, da sie x überall als Variablennamen verwenden, ich kann im Allgemeinen den richtigen Platz innerhalb des Parser-Codes finden, habe aber eine Menge Schwierigkeiten damit.

Antwort

5

Der Typ x ist ein sogenannter type parameter. Dies bedeutet, dass der Typ noch nicht definiert ist.

In Ihrem speziellen Fall bezeichnet die Definition des Typs Task der erste Typ nach Task den Typ, mit dem Ihr asynchroner Vorgang fehlschlagen kann.

Zum Zeitpunkt der Definition der Funktion ist dieser Typ nicht vollständig definiert. Sie haben die Freiheit, in Ihrem Programm, wie Fehler zu verwenden, um die Art eingeben möchten Sie

3

Die Definition:

now : Task x Time 

Mittel (frei übersetzt):

Time.now ist eine Aufgabe die, wenn sie ausgeführt werden, geben Sie entweder:

  • Ausgabe vom Typ x wenn es fehlschlägt,
  • Ausgabe vom Typ Time, wenn es gelingt.

Da die Aufgabe Time.now nie fehlschlagen kann, ist es egal, was der Fehlertyp ist. In Elm bedeuten Kleinbuchstaben (a, b, x, comparable, msg), dass der Typ irgendetwas sein könnte, d. H. Die Funktion würde mit verschiedenen Typen arbeiten.

  • msg für Nachrichtentypen.
  • comparable bedeutet, dass es ein Typ sein muss, wo Sie zwei Werte vergleichen können (z. B. wenn die Funktion einen Vergleich zwischen Werten von dieser Art durchführt, um festzustellen, welche größer ist usw.).

Dies ist für Eingangstypen sinnvoll. Aber weniger für die Ausgabe. Ich denke, in diesem Fall bedeutet die x mehr oder weniger "nicht anwendbar". Ein Task Typ benötigt einen Fehlerausgabetyp. Aber in diesem Fall ist es irrelevant.

Nachtrag: Um tatsächlich die aktuelle Zeit bekommen, würden Sie müssen noch zwei weitere Schritte unternehmen:

  1. die Aufgabe durchführen, die gibt ein Cmd:
    timeCmd = Task.perform identity MyMsg Time.now
    Dies wird die Zeit durchführen -task, und wickeln Sie die resultierende Zeit in einen Cmd MyMsg

  2. Handle den Cmd Ausgang: hierfür müssten Sie inc lude ein MyMsg Handler in Ihrer update Funktion.