Something như
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
Bạn có thể có thể chia liệt kê trong "sự lựa chọn" vì vậy bạn chỉ có các mô tả và các chức năng bên trong nó, một chút xa cách, nhưng hoạt động này. Đánh giá "menu" chức năng sẽ cho phép bạn chọn những gì để làm!
dễ dàng :) thêm một câu hỏi: bạn có thể giải thích dòng đầu tiên: (putSrtln .....) Im newbie trong haskell và không biết rằng các toán tử thích. $ và như vậy. Nếu nó không phải là một vấn đề cho bạn nó sẽ giúp tôi. – gruber
Tôi vừa sửa câu trả lời của mình và làm cho nó linh hoạt hơn! Không được thử nghiệm theo bất kỳ cách nào, tôi chỉ viết nó xuống, nhưng bạn sẽ thấy những gì tôi đã làm ở đó :). Về dòng putStrLn đó: về cơ bản tôi đã viết "putStrLn (unlines (bản đồ concatNums lựa chọn))" mà không có các parantheses :) – LukeN
Được rồi, thử nghiệm ngay bây giờ, hoạt động như một sự quyến rũ! – LukeN