Когда я использую императивный язык, я часто пишу код, подобный
foo (x) {
if (x < 0) return True;
y = getForX(x);
if (y < 0) return True;
return x < y;
}
То есть я проверяю условия одно за другим, как можно быстрее выходя из блока.
Мне это нравится, потому что он сохраняет код «ровным» и подчиняется принципу «конечного веса».Я считаю, что это более читабельно.
Но в Хаскеле я написал бы это как
foo x = do
if x < 0
then return x
else do
y <- getForX x
if y < 0
then return True
else return $ x < y
Что мне не нравится так сильно.Я мог бы использовать монаду, которая позволяет вырваться, но так как я уже использую монаду, мне нужно lift
все, что добавляет слова, которых я бы хотел избежать, если смогу.
Я полагаюнет действительно идеального решения для этого, но есть ли у кого-нибудь совет?