While-Schleife in Haskell mit einer Bedingung
Bin ich ein wenig Haskell Situation hier. Ich versuche, die zwei Funktionen schreiben, mit Monaden.
Zunächst soll zum Durchlaufen einer Funktion, solange die Bedingung wahr ist für die input /output der Funktion. Zweite soll die erste, um eine Zahl als input und schreiben Sie es so lange ausgegeben, bis Sie einen Raum betreten.
Bin ich fest mit dieser Hilfe?
module Test where
while :: (a -> Bool) -> (a -> IO a) -> a -> IO a
while praed funktion x = do
f <- praed (funktion x)
if f == True then do
y <- funktion x
while praed funktion y
else return x
power2 :: IO ()
power2 = do putStr (Please enter a number.")
i <- getChar
while praed funktion
where praed x = if x /= ' ' then False else True
funktion = i
So ist Ihre Frage? Wo sind Sie stecken, was nicht funktioniert?
Diese beiden Funktionen nicht selbst kompilieren noch, und ich bin mir ziemlich sicher, Sie würden nicht tun, was ich will, dass Sie sowieso tun. Ich weiß nur nicht, wie schreiben Sie es in einer funktionierenden version. Ich bin im Grunde versucht, um eine while-Schleife arbeitet mit einem Zustand. So zum Beispiel
Diese beiden Funktionen nicht selbst kompilieren noch, und ich bin mir ziemlich sicher, Sie würden nicht tun, was ich will, dass Sie sowieso tun. Ich weiß nur nicht, wie schreiben Sie es in einer funktionierenden version. Ich bin im Grunde versucht, um eine while-Schleife arbeitet mit einem Zustand. So zum Beispiel
while odd (square 3)
sollte testen, ob Platz 3 ist ungerade, dann verwenden Sie das Ergebnis von Feld 3 = 9 und tun while odd (square 9)
und so weiter und weiter. Technisch sollte es kein x, es sollte nur die Arbeit mit while condition function
InformationsquelleAutor Chris | 2013-07-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einige Hinweise:
if x then True else False
ist überflüssig, es entspricht nurx
.if x == True ...
ist redundant und entsprichtif x ...
.Müssen Sie unterscheiden zwischen
IO
Handlungen und Ihrer Ergebnisse. Zum Beispiel, wenn yo tundann in ...
i
stellt das Ergebnis der Aktion, ein Zeichen, soi :: Char
. AbergetChar :: IO Char
ist die Handlung selbst. Sie können es als ein Rezept, dass gibtChar
bei durchgeführt. Übergeben Sie das Rezept, um auf die Funktionen etc., und es wird nur durchgeführt, wenn irgendwo ausgeführt.Ihre
while
genanntfunktion
zweimal, das ist wahrscheinlich nicht das, was Sie wollen - es würde Sie Lesen, einen Charakter zweimal, überprüfen Sie die erste und die Rückkehr, die zweite. Denken Sie daran, Ihrefunktion
ist eine Aktion, so dass jedes mal, wenn Sie "berufen" der Aktion (zum Beispiel durch Verwendung von<- funktion ...
imdo
notation), wird die Aktion erneut ausgeführt wird. Also sollte es eher etwas sein, wie(Mein code ist auch etwas anders, es prüft das argument, dass der an es übergeben wird.)
Es wird geprüft, ob die Bedingung gilt für das argument des Typs
a
bevor irgendetwas anderes tun, genau wiewhile
Aussagen in funktionalen Sprachen zu tun. Dies geschieht mit Wachen, die oft vorzuziehenif/then/else
. Die Linie| praed x = do ...
sagt wenn die Bedingungpraed x
wahr ist, gehen Sie mit .... Die nächste Zeile| otherwise = ...
umfasst alle übrigen Fälle (weilotherwise
ist nur ein synonym fürTrue
, sootherwise
ist eine Bedingung, die immer erfüllt).if x then True else False
ist nicht ganz entsprichtx
es entspricht(x :: Bool)
obwohlInformationsquelleAutor Petr Pudlák
Für eine Reine version:
für monadischen:
siehe auch:
http://hackage.haskell.org/package/monad-loops, http://hackage.haskell.org/package/loop-while, http://hackage.haskell.org/package/control-monad-loop.
http://www.haskellforall.com/2012/01/haskell-for-c-programmers-for-loops.html
while p = until (not . p)
InformationsquelleAutor JJJ