?

Log in

No account? Create an account
nyaload

Журнал Пушыстого

Журнал Пушыстого

Тернарный оператор в Haskell.
nyaload
_winnie
Забавно.
 
-- define (cond ? a $ b)  Like (cond ? a : b) in C.
(?) cond a = if cond then (\x -> a) else (\x -> x)
 
main = do
    print (True ? 20 $ 30)
    print (True ? 20 $ 10/0)
    print (False ? (10/0) $ 30)
 

Оператор (cond ? a) вернёт либо функцию, возвращую всегда a, либо возвращающую свой аргумент (\x -> x). Когда подставим b этой функции, то соответственно вернётся либо a, либо b. Благодаря ленивости - ненужная ветка не вычисляется (для примера - тут деление на ноль).

PS. Для тех кто совсем не знаком с синтаксисом: f x y это такой способ записать f(x, y), а f $ x это такой способ записать f x, нужен что бы не ставить скобки, a $ b $ c $ d вместо (a (b (c d))).

PPS. Гугль показывает, что я как всегда не оригинален. http://www.google.com/search?hl=ru&q=haskell+ternary+operator
Оказывается, чаще приводят в пример cond ? (a, b).

Так же есть предложения заменить if then else на обычную функцию из стандартной библиотеки, раз уж он так просто пишется на самом языке, причем даже с более сжатым и простым синтаксисом. if' cond a b.