let
допускает несколько определений, как в
main = do
doSomething
let x = 1
y = 2
z = 3
print (x+y+z)
Обратите внимание на отступ. y = 2
не анализируется для продолжения определения x = 1
, поскольку оно начинается в том же столбце.
Если вы хотите, чтобы новая строка анализировалась так, как если бы она продолжала предыдущую строку, вы должны сделать отступ больше. Э.Г.
main = do
doSomething
let x | someCondition = 1
| otherwise = 0 -- more indented
y = 2
z = 3
print (x+y+z)
или, используя другую строку
main = do
doSomething
let x
| someCondition = 1 -- more indented
| otherwise = 0 -- more indented
y = 2
z = 3
print (x+y+z)
Правила отступов на первый взгляд могут показаться странными
довольно просто .
Я думаю, что ваш текущий код настолько элегантен, насколько это возможно - он мне подходит.
Если вы хотите больше альтернатив, вы можете использовать if then else
, даже если большинство Haskellers предпочли бы охранников. (Лично у меня нет реальных предпочтений)
main = do
doSomething
let x = if condition then 1
else if someOtherCondition then 0
else -1
y = 2
z = 3
print (x+y+z)
Вы также можете использовать другую строку, например, (Я бы предпочел это)
main = do
doSomething
let x =
if condition then 1
else if someOtherCondition then 0
else -1
y = 2
z = 3
print (x+y+z)
или даже
main = do
doSomething
let x =
if condition
then 1
else if someOtherCondition
then 0
else -1
y = 2
z = 3
print (x+y+z)
Я не утверждаю, что стиль в подавляющем большинстве случаев лучше, чем другой.