2016-06-28 10 views
2

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

+0

Dies erfordert eine abhängig typisierte Sprache:

import Data.Maybe ... f :: Int -> Maybe Int f num | x >= 0 = Just num | x < 0 = Nothing 

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? – pdexter

+0

Auf 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 ... –

+2

@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

Antwort

8

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.

6

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?

5

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 -> "-"