Qualcosa di simile
menu :: IO()
menu = do
putStrLn . unlines $ map concatNums choices
choice <- getLine
case validate choice of
Just n -> execute . read $ choice
Nothing -> putStrLn "Please try again"
menu
where concatNums (i, (s, _)) = show i ++ ".) " ++ s
validate :: String -> Maybe Int
validate s = isValid (reads s)
where isValid [] = Nothing
isValid ((n, _):_)
| outOfBounds n = Nothing
| otherwise = Just n
outOfBounds n = (n < 1) || (n > length choices)
choices :: [(Int, (String, IO()))]
choices = zip [1.. ] [
("DoSomething", foo)
, ("Quit", bar)
]
execute :: Int -> IO()
execute n = doExec $ filter (\(i, _) -> i == n) choices
where doExec ((_, (_,f)):_) = f
foo = undefined
bar = undefined
Probabilmente si può dividere l'enumerazione di "scelte" in modo da avere solo le descrizioni e le funzioni al suo interno, un po 'di separazione, ma questo funziona. Valutare la funzione "menu" ti permetterà di scegliere cosa fare!
così facile :) ancora una domanda: Potrebbe spiegare prima linea: (putSrtln .....) Im novizio in Haskell e non so che gli operatori come. $ e così via. Se non è un problema per te, mi aiuterebbe. – gruber
Ho appena modificato la mia risposta e l'ho resa più flessibile! Non testato in alcun modo, l'ho appena scritto, ma dovresti vedere cosa ho fatto lì :). Riguardo a questa linea putStrLn: ho praticamente scritto "putStrLn (unlines (map concatNums choices))" senza le parestes :) – LukeN
Ok, testato ora, funziona come un incantesimo! – LukeN