Re[5]: Требуются примеры использования first class function
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 21.11.06 11:43
Оценка:
PhantomIvan,

PI>вот, я как-нибудь подобное реализую, а что такое 10 закон Гринспуна? что все сложное ломается?

Greenspun's Tenth Rule of Programming: "Any sufficiently complicated C or Fortran program contains an ad-hoc, informally-specified bug-ridden slow implementation of half of Common Lisp."


PI>вот эта вот концепция: code is data is code очень даже подходит для символьных вычислений

PI>но я как статически типизированный мэн, должен спросить: насколько реально это перетянуть к себе?
PI>(как насчет: вычисляем в рантайм -> кидаем обратно в сорс?)

У нас есть статический метод Calc.f(double x), тебе надо его расковырять (о, мне это будет очень интересно увидеть), к структуре данных, полученной после расковырки применяется функция deriv, затем по полученной структуре эмиттим класс CalcD с методом df(double x) и грузим его класслоадером. Это реализуемо, но мне не нравится это решение.

LCR>>Вот путь Хаскеля.

PI>он уже ближе к статике, не так ли?
Да, ближе.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[5]: Требуются примеры использования first class function
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 21.11.06 11:46
Оценка:
Mirrorer,

M>Большое человеческое спасибо за пример на Haskell.


Взаимно.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[5]: Требуются примеры использования first class function
От: Курилка Россия http://kirya.narod.ru/
Дата: 21.11.06 12:08
Оценка: 4 (1)
Здравствуйте, PhantomIvan, Вы писали:

PI>вот эта вот концепция: code is data is code очень даже подходит для символьных вычислений

PI>но я как статически типизированный мэн, должен спросить: насколько реально это перетянуть к себе?
PI>(как насчет: вычисляем в рантайм -> кидаем обратно в сорс?)

здесь (D-Expressions: Lisp Power, Dylan Style) есть дока про то как лисповые макросы к обычному синтаксису применить, может к статике/динамике не относится, пок ещё не дошли руки прочитать
Re[2]: Требуются примеры использования first class function
От: Трурль  
Дата: 21.11.06 13:37
Оценка: 21 (3) +1
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Конечно, хотелось бы универсальный пример, показывающий что:

LCR>1. Функции могут присвоены переменным.
LCR>2. Функции могут быть переданы как параметры.
LCR>3. Функции могут быть возвращены как значения.
LCR>4. Функции могут учавствовать в определении структур данных.

Мне очень понравился пример из известной статьи, когда Функции использовались для представления геометрических областей.
> type Region = Point -> Bool

> circle :: Radius -> Region -- creates a region with given radius
> outside :: Region -> Region -- the logical negation of a region
> (/\) :: Region -> Region -> Region -- the intersection of two regions

> annulus :: Radius -> Radius -> Region
> annulus r1 r2 = outside (circle r1) /\ circle r2
Re[3]: Требуются примеры использования first class function
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 21.11.06 14:10
Оценка:
Трурль,

Т>Мне очень понравился пример из известной статьи, когда Функции использовались для представления геометрических областей.

Т>
>> type Region = Point -> Bool

>> circle :: Radius -> Region -- creates a region with given radius
>> outside :: Region -> Region -- the logical negation of a region
>> (/\) :: Region -> Region -> Region -- the intersection of two regions

>> annulus :: Radius -> Radius -> Region
>> annulus r1 r2 = outside (circle r1) /\ circle r2
Т>


Хм, интересная идея. А в чём преимущество по сравнению с представлением области с помощью АТД?
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[4]: Требуются примеры использования first class function
От: Programmierer AG  
Дата: 21.11.06 16:02
Оценка: 11 (1)
Lazy Cjow Rhrr wrote:

> Хм, интересная идея. А в чём преимущество по сравнению с представлением области с помощью АТД?


Вот, набросал для сравнения:
-- Вариант 1

infixl 5 /\
infixl 5 \/

type Point = (Float, Float)

type Region = Point -> Bool

p `inRegion` r = r p

circle (x,y) r = \(x',y') -> (x-x')2 + (y-y')2 < r2
rectangle (x1,y1) (x2,y2) =
    \(x,y) -> x > min x1 x2 && x < max x1 x2 &&
              y > min y1 y2 && y < max y1 y2
outside r = \p -> not (p `inRegion` r)
x /\ y = \p -> (p `inRegion` x) && (p `inRegion` y)
x \/ y = \p -> (p `inRegion` x) || (p `inRegion` y)

-- Вариант 2

infixl 5 /\
infixl 5 \/

type Point = (Float, Float)

data Region = Circle Point Float         |
              Rectangle Point Point      |
              Outside Region             |
              Intersection Region Region |
              Union Region Region

-- функции-конструкторы для единообразия примитивных
-- и сложных регионов
circle = Circle
rectangle = Rectangle
outside = Outside
(/\) = Intersection
(\/) = Union

(x,y) `inRegion` (Circle (x',y') r) = (x-x')2 + (y-y')2 < r2
(x,y) `inRegion` (Rectangle (x1,y1) (x2,y2)) =
    x > min x1 x2 && x < max x1 x2 && y > min y1 y2 && y < max y1 y2
p `inRegion` (Outside r) = not (p `inRegion` r)
p `inRegion` (Intersection x y) = (p `inRegion` x) && (p `inRegion` y)
p `inRegion` (Union x y) = (p `inRegion` x) || (p `inRegion` y)

-- клиентский код
annulus center r1 r2 = outside (circle center r1) /\ (circle center r2)


Количество кода сравнимо, но первый вариант чуть элегантнее, хотя это
субъективно. Ну и чище с философской точки зрения . Какое определение
правильнее: регион — это правило, позволяющее отличить внутренние точки
от внешних, или регион — это круг, прямоугольник и их
пересечения/объединения? Но это больше эстетические отличия,
практические мне видятся такими: у АТД-варианта преимущество в том, что
легко добавлять новые операции. У HOF-варианта преимущество в том, что
примитивы не отличаются от сложных регионов; пользователь такой
библиотеки может добавлять новые примитивы, не изменяя определение типа
Region.

Мне вот интересно, отличаются ли эти варианты по производительности (при
условии, что проверка принадлежности точки сложным регионам выполняется
часто)? В первом варианте функция создания сложного региона (вроде
annulus) фактически конструирует функцию принадлежности, которую тут же,
при компиляции, можно оптимизировать; во втором же случае мы просто
конструируем AST, которое может интерпретироваться в рантайме. Просто
глупая идея, возникшая по ходу, не факт, что компилятор будет
оптимизировать первый вариант или не будет оптимизировать второй.
Posted via RSDN NNTP Server 2.0
Re[5]: Требуются примеры использования first class function
От: Programmierer AG  
Дата: 21.11.06 16:04
Оценка:
Здравствуйте, Programmierer AG, Вы писали:

PA>circle (x,y) r = \(x',y') -> (x-x')2 + (y-y')2 < r2

должно быть (x-x')^2 + (y-y')^2 < r^2, при копировании крышки потерялись.
Re[4]: Требуются примеры использования first class function
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.11.06 17:00
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Владу скорее всего пример не понравится, потому что слишком заумный и оторванный от жизни.


+1

LCR>А мне очень нравится, более того, могу сказать, что современные оптимизаторы в компиляторах — это функции типа simp, только естественно гораздо более сложные.


У меня нет задачи поразить читателя познаниями в области оптимизаций в компиляторах. У меня задача объяснить людям никогда до этого не видивших возможностей Х, то что они могут быть им полезны, и что эти возможности не являются просто заумными закорючками.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Требуются примеры использования first class function
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.11.06 17:00
Оценка:
Здравствуйте, Mirrorer, Вы писали:

M>Можно подглядеть здесь.


M>А вообще примеры в Scala By Example слизаны с SICP


Мне нужны конкретные примеры, а не ссылки в не ссылки в общем направлени.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Требуются примеры использования first class function
От: Dr.Gigabit  
Дата: 21.11.06 17:58
Оценка: -1
LCR>>А мне очень нравится, более того, могу сказать, что современные оптимизаторы в компиляторах — это функции типа simp, только естественно гораздо более сложные.

VD>У меня нет задачи поразить читателя познаниями в области оптимизаций в компиляторах. У меня задача объяснить людям никогда до этого не видивших возможностей Х, то что они могут быть им полезны, и что эти возможности не являются просто заумными закорючками.


Видимо следует читать "объяснить людям никогда до этого не видивших возможностей N"
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Требуются примеры использования first class function
От: Mirrorer  
Дата: 21.11.06 18:46
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Mirrorer, Вы писали:


M>>Можно подглядеть здесь.


M>>А вообще примеры в Scala By Example слизаны с SICP


VD>Мне нужны конкретные примеры, а не ссылки в не ссылки в общем направлени.

A function in Scala is a “first-class value”. Like any other value, it may be passed as
a parameter or returned as a result. Functions which take other functions as parameters
or return them as results are called higher-order functions. This chapter
introduces higher-order functions and shows how they provide a flexible mechanism
for program composition.
As a motivating example, consider the following three related tasks:
1. Write a function to sumall integers between two given numbers a and b:
def sumInts(a: int, b: int): int =
    if (a > b) 0 else a + sumInts(a + 1, b)

2. Write a function to sumthe squares of all integers between two given numbers
a and b:
def square(x: int): int = x * x
def sumSquares(a: int, b: int): int =
    if (a > b) 0 else square(a) + sumSquares(a + 1, b)

3. Write a function to sum the powers 2n of all integers n between two given
numbers a and b:
def powerOfTwo(x: int): int = if (x == 0) 1 else x * powerOfTwo(x 1)
def sumPowersOfTwo(a: int, b: int): int =
    if (a > b) 0 else powerOfTwo(a) + sumPowersOfTwo(a + 1, b)

These functions are all instances of Sum[a..b] f (n) for different values of f . We can factor
out the common pattern by defining a function sum:
def sum(f: int => int, a: int, b: int): double =
    if (a > b) 0 else f(a) + sum(f, a + 1, b)

The type int => int is the type of functions that take arguments of type int and
return results of type int. So sum is a function which takes another function as a
parameter. In other words, sum is a higher-order function.
Using sum, we can formulate the three summing functions as follows.
def sumInts(a: int, b: int): int = sum(id, a, b)
def sumSquares(a: int, b: int): int = sum(square, a, b)
def sumPowersOfTwo(a: int, b: int): int = sum(powerOfTwo, a, b)
    where
def id(x: int): int = x
def square(x: int): int = x * x
def powerOfTwo(x: int): int = if (x == 0) 1 else x * powerOfTwo(x 1)
Re[5]: Требуются примеры использования first class function
От: Mirrorer  
Дата: 21.11.06 18:55
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Lazy Cjow Rhrr, Вы писали:


LCR>>Владу скорее всего пример не понравится, потому что слишком заумный и оторванный от жизни.


VD>+1


А как насчет реализации модного GoF паттерна Interpreter ?
Re[4]: Требуются примеры использования first class function
От: PhantomIvan  
Дата: 21.11.06 19:28
Оценка:
M>>>А вообще примеры в Scala By Example слизаны с SICP

вот, скала — вот с чем надо сравнить немерле
а то может у них что-то еще есть чего нет в немерле, кроме трейтов
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Требуются примеры использования first class function
От: PhantomIvan  
Дата: 21.11.06 19:41
Оценка: -1
PI>>вот, я как-нибудь подобное реализую, а что такое 10 закон Гринспуна? что все сложное ломается?
LCR>

LCR>Greenspun's Tenth Rule of Programming: "Any sufficiently complicated C or Fortran program contains an ad-hoc, informally-specified bug-ridden slow implementation of half of Common Lisp."


Гринспун явно считал, что свет на Лиспе клином сошелся

PI>>вот эта вот концепция: code is data is code очень даже подходит для символьных вычислений

PI>>но я как статически типизированный мэн, должен спросить: насколько реально это перетянуть к себе?
PI>>(как насчет: вычисляем в рантайм -> кидаем обратно в сорс?)

LCR>У нас есть статический метод Calc.f(double x), тебе надо его расковырять (о, мне это будет очень интересно увидеть), к структуре данных, полученной после расковырки применяется функция deriv, затем по полученной структуре эмиттим класс CalcD с методом df(double x) и грузим его класслоадером. Это реализуемо, но мне не нравится это решение.


ага, мне тоже не нравится, когда буду делать (на немерле) — получится ближе к хаскелю (деревья однако)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Требуются примеры использования first class function
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 22.11.06 00:25
Оценка: +1
VladD2,

LCR>>Владу скорее всего пример не понравится, потому что слишком заумный и оторванный от жизни.


VD>+1


ЮИЙО! Я однако мысли научился читать!

VD>У меня нет задачи поразить читателя познаниями в области оптимизаций в компиляторах. У меня задача объяснить людям никогда до этого не видивших возможностей Х, то что они могут быть им полезны, и что эти возможности не являются просто заумными закорючками.


Да всё это понятно. С одной стороны, пример должен быть достаточно простым, чтобы не перегружать читателя. Но с другой стороны, пример должен быть достаточно сложный, чтобы продемонстрировать существенность различий между решениями. А если добавить сюда то, что есть очень скептически настроенные товарищи, как например

I can't really imagine needing anything else in a language that isn't catered for in c# or vb.net for example.
...
I write in .net. I can't think of why I'd need another language.

то задача поиска подходящих примеров становится ну просто очень сложной...

PS: Цитата взята с why do people keep creating new languages.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[6]: Требуются примеры использования first class function
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.11.06 01:23
Оценка:
Здравствуйте, Mirrorer, Вы писали:

M>А как насчет реализации модного GoF паттерна Interpreter ?


А кому он реально нужен?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Требуются примеры использования first class function
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.11.06 01:23
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Да всё это понятно. С одной стороны, пример должен быть достаточно простым, чтобы не перегружать читателя. Но с другой стороны, пример должен быть достаточно сложный, чтобы продемонстрировать существенность различий между решениями.


Именно. Причем он еще не должен быть надуманным. В общем, но не должен вызывать никаких отрицательных эмоций.

LCR> А если добавить сюда то, что есть очень скептически настроенные товарищи, как например...


Что-то вроде. Но део не в радикальных взглядах. Дело в синдроме Блаб-программиста. Надеюсь про это пояснять не потребуется?

LCR>то задача поиска подходящих примеров становится ну просто очень сложной...


Просто и доходичво объяснить совсем непонятные вещи в принципе очень сложная задача. К сожалению когда мы привыкаем к чему-то, то восвсем забываем как работал наш мозг до знакомства с этим чем-то. И это приводит к тому, что мы плохо объясняем. Для ФП это настоящий бич.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Требуются примеры использования first class function
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.11.06 01:23
Оценка:
Здравствуйте, Алексей П, Вы писали:

АП>Для ГУИ здорово подходят макросы Nemerle,


Макросы можно продемонстрировать на тысячах примеров. И их суть (в общем) понятна почти всем. Я говорю о функциональных изысках вроде функции первоклассные объеты и сопоставление с образцом.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Требуются примеры использования first class function
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.11.06 01:23
Оценка:
Здравствуйте, PhantomIvan, Вы писали:

PI>тут наверно, как в императивщине — смотришь в чужой код, иногда думаешь, о! интересный оборот...


Вот и нужны такие места. Но так чтобы примеры не были надумаными, были понятны большиству и при этом демонстрировали реальные приемущества.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Требуются примеры использования first class function
От: Tonal- Россия www.promsoft.ru
Дата: 22.11.06 05:32
Оценка:
Я как то делал оба варианта на С++.
Первый — на шаблонах, второй на виртуальности.
Как вы думаете — какой был быстрее?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.