Wie schreibe ich eine Funktion, die ein Int
als Eingabe nimmt und dass Int
wenn es > 0
oder sonst ist "-"
einen Strich zurück, wenn es < 0
ist. Ich verstehe, dass Haskell mit seinen Typen streng ist, aber gibt es einen Weg um dies zu erreichen?einen String oder ein Int je nach Eingabe Rückkehr
Antwort
Haskell ist statisch typisiert, was bedeutet, dass Sie den Typ normalerweise nicht in Abhängigkeit vom Laufzeit-Inhalt ändern können.
können Sie jedoch verwenden, um den Either
Typen:
fun :: Int -> Either Int String
fun x | x > 0 = Left x
| otherwise = Right "-"
Either
wie folgt definiert ist:
data Either a b = Left a | Right b
können Sie dann, ob später in Ihrem Programm Abfrage, die Sie mit dem linken Konstruktor oder rechts zu tun Konstrukteur.
Ich denke, der Haskell Weg dies zu tun wäre Maybe
.
positive :: Int -> Maybe Int
positive x | x >= 0 = Just x
| x < 0 = Nothing
Dann können Sie Mustererkennung, um zu sehen, wenn Sie ein Just
oder ein Nothing
bekommen. Sonst gibt es keine Möglichkeit, eine Funktion zu schreiben, die das tut, was Sie sagen - was wäre ihre Signatur: Int -> Int
oder Int -> String
?
Funktionen in Haskell müssen einen einzelnen Typ zurückgeben. Sie können darüber streiten, ob dies vorteilhaft ist (siehe this Programmers.SE post), aber ohne in viel kompliziertere Teile der Sprache einzutauchen, müssen Sie damit umgehen.
Ähnlich wie @pdexter in den Kommentaren erwähnt und @ Alec in seiner Antwort erwähnt, ist eine Maybe
der beste Weg, damit umzugehen.
-- Let's assume you want to bind the result to a String type
let num = f Number
putStrLn $ case num of
Just x -> show x
Nothing -> "-"
Dies erfordert eine abhängig typisierte Sprache:
dann in der anderen Code können Sie die
Maybe
behandeln. Alternativ schlage ich vor, ein 'Maybe Int' zu verwenden. Hast du von 'Vielleicht' gehört? – pdexterAuf der einen Seite verleitet mich der Geist von StackOverflow dazu, eine [Antwort] (https://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Dynamic.html#t:Dynamic) oder zu schreiben [zwei] (https://hackage.haskell.org/package/base-4.9.0.0/docs/Unsafe-Coerce.html#v:unsafeCoerce); auf der anderen Seite sagt der Geist der Pädagogik, dass diese Frage vor allem für Anfänger auftritt, die durch die Antwort beschädigt werden würden ... –
@DanielWagner Vielleicht wäre eine selbst-beantwortete Frage für eine kanonische Antwort auf höherer Ebene von Vorteil. Ich habe mehrere ähnliche Fragen dieser Art gesehen (und bin selbst auf das gleiche Problem gestoßen). Sie könnten in der Antwort auch Warnungen hinzufügen, um Neulinge in der Sprache abzuweisen. – jkeuhlen