www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

IKT

Gepostet:
11.02.2012 15:28

Input überprüfen  
Hallo,

ich bin noch ein Haskell-Neuling und habe eine Frage zu folgendem (schönen wie ich finde) Beitrag:
http://stackoverflow.com/questions/127190/good-haskell-coding-style-of-if-else-control-block/2096144#2096144

Wenn man das in dem Beitrag vorgestellte Programm startet und einen String eingibt kommt \"Prelude.read: no parse\",
ich denke, weil isCorrect ein Int erwartet, read aber \"s\" nicht zu Int \"konvertieren\" (?) / als Int auffassen kann.

Wie kann ich verhindern, dass es zu dieser Fehlermeldung kommt?
Ich dachte daran, dass man dies dieser Funktion machen könnte:

untilM :: Monad m => (a -> m Bool) -> m a -> m ()
untilM p a = do
x <- a
done <- p x
if done
then return ()
else untilM p a


Nach dem \"x<-a\", überprüfen ob ein Int vorliegt (ich wüsste aber gerade nicht mit welcher Funktion man das machen könnte).

Andererseits, wenn man das dort machen würde, fände ich das irgendwie nicht so schön... gibt es einen eleganteren Weg zu überprüfen was vorliegt und ggf mit einem Hinweis abzubrechen?
Zum Seitenanfang    
 
Landei

Gepostet:
13.02.2012 08:59

   
Da kann dir die Funktion reads weiterhelfen. Die nimmt einen String und gibt eine Liste möglicher Parse-Resultate (in der Praxis entweder null oder eins) als Wert-Reststring-Paare zurück:


reads \"123\" :: [(Int,String)]
-- [(123,\"\")]

reads \"bla\" :: [(Int,String)]
-- []

reads \"[1,2,3]\" :: [([Int],String)]
-- [([1,2,3],\"\")]


Natürlich kann beim isolierten Aufruf hier der Typ nicht inferiert werden, so dass ich ihn explizit angeben muss, aber innerhalb eines Programms ist das meistens unnötig.
Zum Seitenanfang