Я только что начал Haskell, и это полностью смущает меня. Я делал Java и Python, перед которым было намного больше смысла для меня.
В настоящее время я пытаюсь получить пользовательский ввод, проверьте, действительно ли он, если нет: напечатайте ошибку и снова введите этот ввод; если он действителен: выведите из него булевское значение.
Чтобы быть более точным, мне нужен вход yes/no, где "y" будет выдавать True, "n" будет выдавать False, а любой другой вход будет печатать сообщение в командной строке и запрашивать ввод y/n еще раз.
например:.
Continue? y/n:
> assd
Invalid input.
Continue? y/n:
> y
(something happens)
Continue? y/n:
> n
(Close program)
Записывая его в семейном формате, выполните следующие действия:
boolean inputBool() {
while(True) {
str = input("Continue? y/n: ");
if (str == "y") {
return True;
} else if (str == "n") {
return False;
} else {
print("Invalid input");
}
}
--main program--
while(inputBool()) {
doSomething();
}
Поскольку я только начал haskell (сегодня на самом деле), у меня нет большой идеи, что я могу или не могу сделать. Я думал о чем-то подобном:
yesno :: Bool
yesno = do
putStr "Continue? y/n: "
str <- readLn
if (str == "y") then True else (
if (str == "n") then False else (
do
putStrLn "Invalid input."
yesno
)
)
Это не работает по многим причинам. Моя основная проблема заключается в том, что я не знаю, что это делает. Я просто прочитал его, когда он нуждается в операциях io, и каким-то образом выполняет следующие выражения. Что не имеет смысла для меня после прочтения, что в haskell все оценивает значение. Что делает "делать"? Кроме того, какой отступ ожидается? Кажется, это случайный случай. Я знаю, что функция должна оценивать мое логическое значение, которое не представляется возможным при использовании этой операции "делать". Но тогда как я что-то печатаю на консоли и все еще делаю это частью выражения, которое оценивается как True или False?
Спасибо за любую помощь.
(Кстати, есть ли в Интернете активные форумы haskell? Я не нашел ни одного =/)