?

Log in

No account? Create an account
nyaload

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

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

Previous Entry Share Flag Next Entry
Тернарный оператор в 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.


  • 1
Достигнуто полное сходство по записи с сишным:
http://www.haskell.org/haskellwiki/Ternary_operator
Правда перегружен привычный (:)

Зато ты классно придумал с $.

"Мы решили проблему которую сами себе создали. Ура, товарищи, ура!".

Хотя веселуха, конечно.

Ваш вариант был бы более хаскельным в таком виде:
cond ? a = \b -> if cond then a else b


Дык, эмуляция булевой логики на комбинаторной :)
-- t=then, e=else, c=constant, f=function

-- все булевы значения суть комбинаторы-мультиплексоры
type BoolConst :: a -> a -> a

cTrue  t e = t
cFalse t e = e

-- булевы функции суть комбинаторы
fNot c t e = c e t

fAnd c1 c2 t e = c1 (c2 t e) e
fOr  c1 c2 t e = c1 t (c2 t e)

-- или можно выразить их вот так (спрятав сущность результата как мультиплексора)
fNot c = c cFalse cTrue
fAnd c1 c2 = c1 c2 cFalse
fOr  c1 c2 = c1 cTrue c2
-- или даже без констант (понимая, какие значения принимают аргументы)
fNot c = c cFalse c
fAnd c1 c2 = c1 c2 c1
fOr  c1 c2 = c1 c1 c2


А функции, которые ты возвращаешь из оператора (?), - это const a и id.

Наврал в последнем определении fNot. Там всё-таки должно быть с обеими константами.

Re: Развлекаемся

Чёрч побьери! Хаскел кари тьюринг комплит пеано унлямбда лазюк!

Ещё прикольно то, что (?) :: Bool -> BoolConst
cTrue = (true ?)
cFalse = (false ?)

-- и немножко лифтинга
cNot = (not ?!)
cAnd = ((&&) ?!!)
cOr = ((||) ?!!)
-- как поизящнее реализовать ?! и ?!! - тут надо подумать

И они ещё спрашивают, почему мы отвечаем вопросом на вопрос? :)

А подскажите, где надыбать раскрасчика кода для хаскела и С++?

C++, ручная работа, красит любое извращение - http://dobrokot.nm.ru/WinnieColorizer.html
http://colorizer.net/ и http://www.chami.com/colorizer/ - онлайновое универсальное, увы нет Haskell.
Что бы раскрасить Haskell - я установил консольный интерпретатор PHP и geshi. Наверное, есть способ проще, но сходу онлайновый колорайзер я не нашёл.

Товарищи под vim и emacs говорят, что их редакторы могут выдавать html, а не только красить на экране.

в обоих редакторах можно написать скрипт, выдающий раскрашенный html, ну и, естественно, они написаны и давно включены в поставку

Я для Хаскелла пользую Edit+, к которому приделал файл с раскраской синтаксиса Хаскелла, затем в настройках редактора просто подобрал приятные цвета, ну и выделенный фрагмент текста копирую в буфер обмена в виде HTML...

Если бы можно было бы в Visual Studio установить нормальную сборку Visual Haskell, то можно было бы также сделать...

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

Кстати, в языке Clean так и сделано...

  • 1