Здравствуйте, VladD2, Вы писали:
L>>Т.е. "negates xs = filter (\x -> x < 0) xs" лучше, чем "negates = filter (<0)"?
VD>Чтобы не трепаться в пустую... Вот кусок кода который я написал вчера для проекта интеграции: VD>
VD>foreach ((name, lst) when lst.Exists(_ is MethodBuilder)in _extension_methods.KeyValuePairs)
VD> ...
VD>
VD>"_ is MethodBuilder" превращается в нужную фукнцию. Точно так же вместо твоего negates можно просто написать "filter(_ < 0)".
Vermicious Knid wrote: > Вот на OCaml пишется крайне много парсеров, при этом карринг там есть, но в этих парсерах я его осознанного и целенаправленного применения(в смысле всяких комбинаторов итп) не видел. Ostap.
Могу еще свой велосипед с треугольными колесами показать, но ты его тем
более зарубишь, на нем парсеры выглядят так:
let digit_p =
item_p >>= function'0' -> return 0
| '1' -> return 1
| '2' -> return 2
| '3' -> return 3
| '4' -> return 4
| '5' -> return 5
| '6' -> return 6
| '7' -> return 7
| '8' -> return 8
| '9' -> return 9
| _ -> fail
let unsigned_p =
one_or_more digit_p >>= fun digits ->
return (List.fold_left (fun x y -> x*10 + y) 0 digits)
let sign_p =
item_p >>= function'+' -> return 1
| '-' -> return (-1)
| _ -> fail
let opt_sign_p = optional sign_p 1
let integer_p =
opt_sign_p >>= fun sign ->
unsigned_p >>= fun x ->
return (sign * x)
let fractional_part_p =
literal_p '.' >>
unsigned_p >>= fun f ->
return f
let real_p =
opt_sign_p >>= fun sign ->
unsigned_p >>= fun i ->
optional fractional_part_p 0 >>= fun f ->
return (make_real sign i f)
Вообще смысл спора непонятен. Человек спросил, как можно применять
карринг. Ответ — кроме очевидных применений вроде map (+1), можно делать
карманные DSL без макросов и прочей тяжелой артиллерии. Понятно, подход
имеет ограничения. Но зачем опять доказывать, что Немерле лучше всех, а
Хаскелл — игрушки для математиков, и причем тут рукописные парсеры — .
Здравствуйте, ie, Вы писали:
ie>Ниче не понял, но очень интересно! ie>А почему так? Можешь в нескольких словах пояснить?
let fib n = 1;;
у нас определена функция fib
теперь мы её переопределяем
let fib n = if n < 2 then 1 else fib(n-1) + fib(n-2);;
здесь ссылки на старое определение -^----------^
ещё раз переопределяем
let rec fib n = if n < 2 then 1 else fib(n-1) + fib(n-2);;
а здесь те же ссылки уже на вновь определямое значение
Здравствуйте, Трурль, Вы писали:
ie>>Ниче не понял, но очень интересно! ie>>А почему так? Можешь в нескольких словах пояснить? Т>
Т> let fib n = 1;;
Т>у нас определена функция fib
Т>теперь мы её переопределяем
Т> let fib n = if n < 2 then 1 else fib(n-1) + fib(n-2);;
Т>здесь ссылки на старое определение -^----------^
Т>ещё раз переопределяем
Т> let rec fib n = if n < 2 then 1 else fib(n-1) + fib(n-2);;
Т>а здесь те же ссылки уже на вновь определямое значение
Т>
Теперь ясно. Неясно лишь одно. Для каких нужд может потребоваться такое переопределение. Не черевато ли оно ошибками?
Здравствуйте, lomeo, Вы писали:
ie>>Теперь ясно. Неясно лишь одно. Для каких нужд может потребоваться такое переопределение. Не черевато ли оно ошибками? L>Это еще фигня. Вот взаимно рекурсивные функции надо объявлять вместе (если я не прав, поправьте плиз).
L>let rec f x = g x
L> and g x = f x;;
Фактически, когда мы пишем на ML
let x = .....
let y = .....
let z = .....
.....
это эквивалентно
let x = ( ..... )
in
let y = ( ..... )
in
let z = ( ..... )
in
( ..... )
end
end
То есть, у нас не один глобальный scope (область видимости имён), а туча вложенных друг в друга.
let rec x = definition() in expression() вводит определяемое имя внутрь области, относящейся к definition(), а просто let — в область expression().
Но из синтаксического сахара это неочевидно!!!
Другое дело — например, Хаскелл, где области видимости большие и зрительно различимые.
x = ... y ... z ... -- это глобальные имена
y = -- всё что ниже и оттабулировано - это вложенная область видимости
... x ... -- поэтому компилятор видит локальный x (а человек понимает, что искать x надо сперва в блоке where, и только потом вовне)where
x = .....
z = ... x ... y ... -- это глобальные имена
Табуляция в Хаскелле — это тоже сахар, но он соответствует всего лишь скобкам, внутри которых — конъюнкция. Коммутативная и ассоциативная, в отличие от let-in.
Здравствуйте, VladD2, Вы писали:
VD>В обещм, вопрос как всегда в терминах. Что есть тяжелая артилерия, а что мирный атом.
Я не берусь утверждать, т.к. опыта использования макросов практически нет, но мне кажется, что микро-DSL на одних лишь HOF требуют меньше кода.
lomeo,
L>Ух, как красиво. Всё больше убеждаюсь, что пора учить Эрланг. Очень уж он на лисп похож
Подозреваю, что после Хаскеля изучение Эрланга (языка) займёт 2-3 часа . Самое интересное — это библиотеки, и тут только просмотр списка библиотек, входящих в OTP займёт значительное время.
Здравствуйте, Lazy Cjow Rhrr, Вы писали:
LCR>Подозреваю, что после Хаскеля изучение Эрланга (языка) займёт 2-3 часа :-). Самое интересное — это библиотеки, и тут только просмотр списка библиотек, входящих в OTP займёт значительное время.