Re[14]: currying
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 08.09.06 07:48
Оценка:
Здравствуйте, 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)".


xs забыл. А без xs это уже карринг.
Re[12]: currying
От: Programmierer AG  
Дата: 08.09.06 07:52
Оценка: 20 (2) +2
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 без макросов и прочей тяжелой артиллерии. Понятно, подход
имеет ограничения. Но зачем опять доказывать, что Немерле лучше всех, а
Хаскелл — игрушки для математиков, и причем тут рукописные парсеры — .

Предлагаю мир .
Posted via RSDN NNTP Server 2.0
Re[10]: currying
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 08.09.06 07:55
Оценка: 4 (1)
Здравствуйте, ie, Вы писали:

ie>Ниче не понял, но очень интересно!

ie>А почему так? Можешь в нескольких словах пояснить?

Второй fib использует первый в своём определении, ну и складывает две единички.
А rec говорит о том, что fib — это ссылка на самого себя.
Re[10]: currying
От: Трурль  
Дата: 08.09.06 07:57
Оценка: 4 (1)
Здравствуйте, 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);;
а здесь те же ссылки уже на вновь определямое значение
Re[11]: currying
От: ie Россия http://ziez.blogspot.com/
Дата: 08.09.06 08:25
Оценка:
Здравствуйте, Трурль, Вы писали:

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);;
Т>а здесь те же ссылки уже на вновь определямое значение
Т>


Теперь ясно. Неясно лишь одно. Для каких нужд может потребоваться такое переопределение. Не черевато ли оно ошибками?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[12]: currying
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 08.09.06 08:40
Оценка:
Здравствуйте, ie, Вы писали:

ie>Теперь ясно. Неясно лишь одно. Для каких нужд может потребоваться такое переопределение. Не черевато ли оно ошибками?


Это еще фигня. Вот взаимно рекурсивные функции надо объявлять вместе (если я не прав, поправьте плиз).

let rec f x = g x
    and g x = f x;;
Re[13]: currying
От: ie Россия http://ziez.blogspot.com/
Дата: 08.09.06 09:07
Оценка:
Здравствуйте, lomeo, Вы писали:

L>Это еще фигня. Вот взаимно рекурсивные функции надо объявлять вместе (если я не прав, поправьте плиз).


L>
L>let rec f x = g x
L>    and g x = f x;;
L>


Прав, но и тут мне интуитивно кажется, что rec лишний.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[13]: currying
От: Кодт Россия  
Дата: 08.09.06 09:54
Оценка: +1
Здравствуйте, 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.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[13]: currying
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.09.06 18:25
Оценка:
Здравствуйте, Programmierer AG, Вы писали:

PA>можно делать карманные DSL без макросов и прочей тяжелой артиллерии.


В обещм, вопрос как всегда в терминах. Что есть тяжелая артилерия, а что мирный атом.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: currying
От: Programmierer AG  
Дата: 09.09.06 10:05
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>В обещм, вопрос как всегда в терминах. Что есть тяжелая артилерия, а что мирный атом.

Я не берусь утверждать, т.к. опыта использования макросов практически нет, но мне кажется, что микро-DSL на одних лишь HOF требуют меньше кода.
Re[11]: currying
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 11.09.06 04:16
Оценка: 8 (1) +1
lomeo,

L>Ух, как красиво. Всё больше убеждаюсь, что пора учить Эрланг. Очень уж он на лисп похож

Подозреваю, что после Хаскеля изучение Эрланга (языка) займёт 2-3 часа . Самое интересное — это библиотеки, и тут только просмотр списка библиотек, входящих в OTP займёт значительное время.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[12]: currying
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 11.09.06 07:35
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Подозреваю, что после Хаскеля изучение Эрланга (языка) займёт 2-3 часа :-). Самое интересное — это библиотеки, и тут только просмотр списка библиотек, входящих в OTP займёт значительное время.


Спасибо! Буду иметь в виду :-)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.