Versuch, fizzBuzz mit einer Befehlszeile mit optparse-applicative zu implementieren.Wie passe ich Typen in Haskell an, sodass der erwartete Typ dem tatsächlichen Typ entspricht?
import Options.Applicative
data Args = Args { firstDivisor :: Int,
secondDivisor :: Int,
upperBound :: Int }
fizzBuzz :: Args -> IO()
fizzBuzz opts i
| i `mod` firstDivisor opts == 0 && i `mod` secondDivisor opts == 0 = "fizzBuzz"
| i `mod` firstDivisor opts == 0 = "fizz"
| i `mod` secondDivisor opts == 0 = "buzz"
| otherwise = show i
main :: IO()
main = print fizzBuzz
Ich habe es bis in drei Befehlszeilenargumente zu übernehmen; zwei Teilern (in FizzBuzz in der Regel 3 und 5), und die dritte die obere Grenze (in der Regel 100), aber wenn ich zu kompilieren gehen erhalte ich eine Fehlermeldung, dass:
Couldn't match expected type ‘Int -> [Char]’
with actual type ‘IO()’
The equation(s) for ‘fizzBuzz’ have two arguments,
but its type ‘Args -> IO()’ has only one
Mein Hauptziel ist es einfach auszudrucken Die fizzBuzz-Serie mit den drei Befehlszeilenargumenten. Von dem, was ich verstehe, ist es nicht so, dass ich fizzBuzz mit einem zusätzlichen Parameter versorgt habe. Versuchen zu verstehen, warum 'ich' hier nicht funktionieren würde.
UPDATE:
Dieser Code Ich fühle mich näher, da sie die Kommandozeile mit getArgs
statt optparse Adressen. Außerdem wurde eine Liste hinzugefügt, die gegen fizzBuzz
ausgeführt werden kann.
import System.Environment
main :: IO()
main = do
[s1,s2,s3] <- getArgs
print m
m = [ fizzBuzz i| i <-[1..s3]]
fizzBuzz i
| i `mod` s1 == 0 && s1 `mod` s2 == 0 = "fizzBuzz"
| i `mod` s1 == 0 = "fizz"
| i `mod` s2 == 0 = "buzz"
| otherwise = show i
Also mein Problem ist, dass ich nicht die s1 und s2 Variablen, um meine FizzBuzz goin zu erhalten zugreifen kann. Wie kann ich auf diese Argumente außerhalb des Hauptbereichs zugreifen? Vielleicht gibt es eine andere Funktion, die helfen kann?
'FizzBuzz :: Args - > IO() 'sagt, dass' fizzBuzz' eine Funktion ist, die einen 'Args' als Parameter nimmt und ein' IO() 'zurückgibt. Aber dann erklärt 'fizzBuzz opts i' zwei Argumente. Und in allen Fällen versucht es eine Zeichenfolge zurückzugeben. – immibis
Wenn Sie ein Anfänger sind, würde ich für einen einfacheren Ansatz gehen und optarse-applicative vermeiden. Verwenden Sie einfach '[s1, s2, s3] <- getArgs', um drei Strings aus den Argumenten zu erhalten, wandeln Sie sie in Zahlen mit' read' um und gehen Sie weiter. Für Bonuspunkte behandeln Sie später den falschen Argumentfall (nicht drei/nicht numerisch) mit 'reads' oder' readMaybe'. Aber zuerst, lernen Sie, wie Sie die IO-Monade mit einem guten Tutorial verwenden. – chi
Sie müssen es auch irgendwie tun, um all das für alle Zahlen in '[1..upperBound]' zu tun. – Gurkenglas