Ich versuche, eine Bibliothek von JS portieren, und ich habe zu einer Funktion, die entweder eine Zeichenfolge oder eine Liste von Zeichenfolgen nehmen kann. Wenn eine Zeichenfolge angegeben wird, wird sie in eine Liste von Zeichenfolgen aufgeteilt und dann so fortgesetzt, als ob sie an erster Stelle übergeben wurde.Können Sie eine Funktion in Elm mehr als einen Typ nehmen? Kannst du eine überladene Funktion haben?
Ich kann es tun, indem ich meinen eigenen Typ definiere, aber es macht die API hässlich und erfordert ein benutzerdefiniertes Type-Präfix für Ihre Daten.
Hier ist, was ich habe:
type DocumentBody = Raw String | Words List String
tokenize: DocumentBody -> List String
tokenize s =
case s of
Raw str_body -> String.split " " str_body |> (List.map String.toLower)
Words list_body -> List.map String.toLower list_body
-- Tests
tests =
suite "Tokenizer"
[ test "simple" <| assertEqual ["this", "is", "a", "simple", "string"]
<| tokenize (Raw "this is a simple string")
, test "downcasing tokens: string" <| assertEqual ["foo", "bar"]
<| tokenize (Raw "FOO BAR")
, test "downcasing tokens: list of str" <| assertEqual ["foo", "bar"]
<| tokenize (Words ["Foo", "BAR"])
]
Letztlich glaube ich nicht, dass der Port diese Art von Verhalten unterstützen sollte, aber wie wollen Sie Mustererkennung nur auf den Aufzählungen der Art statt benötigt das Präfix Raw
oder Words
in meinem Beispiel?
"... du wirst nicht in der Lage sein, Funktionssignaturen zu duplizieren ..." oder vielmehr, dupliziere das komplette Fehlen von ihnen;) –
auf deinen Punkt, jetzt muss der Anrufer wissen, was ein 'DocumentBody' ist Da dies der Typ ist, den diese Funktion benötigt, ist es sinnvoll, ihnen die Präfixe 'Raw' und' Words' zu geben. –
Richtig, und das ist nichts, was über Ports sauber gemacht wird, also würde ich mich darauf konzentrieren, es aufzuteilen getrennte Funktionen. –