2015-12-17 3 views
2

У меня есть сложный оператор if, который не очень хорошо читается. он работает аналогично следующему примеру:Функциональный эквивалент выражения if с переменным сравнением

let a = 1 
let b = 2 
let test v = true 
if a <> b then a - 1 
else 
    if (test a) then a + 1 
    else a 

Есть ли лучшее функциональное решение? Я подумал о чем-то вроде

match a with 
| b -> ... 
| _ -> ... 

но это не работает, конечно, так как b становится внутри этого утверждения.

ответ

3

Вот как это будет выглядеть со спичкой

match a with 
|foo when foo=b -> .. 
|foo when test foo -> ... 
|_ -> a 

вам нужно использовать when

+0

Как легко. Я уже пользовался, когда очень часто, но я застрял в этой простой проблеме. Теперь код выглядит красиво. –

+3

TBH, я думаю, это выглядит глупо против «if .. elif .. else» для этого. – ildjarn

+3

@ildjarn - Я склонен согласиться –

5

Там нет ничего «нефункциональным» о if..then..else выражений; даже Haskell имеет их;)

Хотя, как ответ показывает Джона Палмера, вы можете написать

match a with 
| foo when foo <> b -> a - 1 
| foo when test foo -> a + 1 
| _ -> a 

вы также можете написать

if a <> b then a - 1 
elif test a then a + 1 
else a 

Лично в этом случае я бы предпочел if..then..else синтаксис, поскольку он немного короче и (ИМО) более кратким.

Смежные вопросы