Re[3]: Какой функциональный язык стоит изучать?
От: Mamut Швеция http://dmitriid.com
Дата: 08.03.07 08:12
Оценка:
G>> Это единственный неакадемический ФЯ.

АХ>Я бы назвал Common Lisp тоже вполне практическим.


У CL есть одна проблемка — неоднозначность реализаций. То есть да, выучить, как писать макросы, например, можно в любой реализации. Но вот ни в threading ни в работу со строками уже не полезешь, потому что они для разных реализаций разные.

Тут правда, все упирается в то, что подразумевается под "выучить ФЯ".


dmitriid.comGitHubLinkedIn
Re[4]: Какой функциональный язык стоит изучать?
От: KlimovS  
Дата: 08.03.07 11:45
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, <Аноним>, Вы писали:


[skip]
VD>Это хорошо... что ты плоский и зеленый, тфу ты, анонимный и никому неизвестный. Ни то стройные ряды дубокодеров будут шириться до кончины рода человеческого.

Грубо. Не смешно.
-1
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Какой функциональный язык стоит изучать?
От: Курилка Россия http://kirya.narod.ru/
Дата: 09.03.07 08:34
Оценка:
Здравствуйте, Андрей Хропов, Вы писали:

АХ>Здравствуйте, Gaperton, Вы писали:


G>>Во-вторых, это, к сожалению, пока единственный ФЯ, на котором не только говорят,


G>> но и делают промышленный софт.


АХ>А как же Common Lisp? Он уж пораспространеннее Erlangа будет в коммерческих приложениях.


Ммм, а можно хоть примерный список? Про Эрланг вот видел, а про CL...
Re[4]: Какой функциональный язык стоит изучать?
От: Mamut Швеция http://dmitriid.com
Дата: 09.03.07 10:10
Оценка:
АХ>>А как же Common Lisp? Он уж пораспространеннее Erlangа будет в коммерческих приложениях.

К>Ммм, а можно хоть примерный список? Про Эрланг вот видел, а про CL...



Наверное, имеется в виду вот это: Success Stories


dmitriid.comGitHubLinkedIn
Re[7]: Какой функциональный язык стоит изучать?
От: Аноним  
Дата: 09.03.07 20:34
Оценка:
VD>>Да и какой Паскаль? Виртовский? Еги реализацию и найти то уже не просто. А Дельфи будет мало чем отличаться от Явы/C# скажем.
CS>Чистый Паскаль найти легко. Тот же FreePascal например.

Чистый??? ТАм Delphi-расширений до фига, Apple Object Pascal, GNU Pascal...
Вот уж совсем он не чистый.

Из относительно чистых — можно попробовтаь скачать Turbo Pascal 1.0 — едва ли там много чего добавить успе Кан тoгда
Re[8]: Какой функциональный язык стоит изучать?
От: raskin Россия  
Дата: 09.03.07 20:37
Оценка:
Аноним 320 wrote:
> VD>>Да и какой Паскаль? Виртовский? Еги реализацию и найти то уже не
> просто. А Дельфи будет мало чем отличаться от Явы/C# скажем.
> CS>Чистый Паскаль найти легко. Тот же FreePascal например.
>
> Чистый??? ТАм Delphi-расширений до фига, Apple Object Pascal, GNU Pascal...
> Вот уж совсем он не чистый.
>
> Из относительно чистых — можно попробовтаь скачать Turbo Pascal 1.0 —
> едва ли там много чего добавить успе Кан тoгда
В режим турбо паскаля Free Pascal Compiler загнать можно.
Posted via RSDN NNTP Server 2.1 beta
Re[9]: Какой функциональный язык стоит изучать?
От: Аноним  
Дата: 09.03.07 22:48
Оценка: 1 (1)
>> Из относительно чистых — можно попробовтаь скачать Turbo Pascal 1.0 —
>> едва ли там много чего добавить успе Кан тoгда
R>В режим турбо паскаля Free Pascal Compiler загнать можно.

Опять же — какого ?
Я же первую версию TP упомянул не из-за любви к программам в 60 КБ весом.
Просто тогда среди всех TP там должно быть наименьшее количество расширений.
Еще можно попробовать найти UCSD PAscal.

А Free Pascal делался с максимальной совметсимостью и "загнать" его можно — вот только обрезать все фичи до TP 1.0 — вряд ли.
И учить программированию, когда перед паскалевским кодом будем десяток строчек обрезающих компилятору разные гланды — совсем не наглядне будет
Re[3]: Какой функциональный язык стоит изучать?
От: Gaperton http://gaperton.livejournal.com
Дата: 11.03.07 12:08
Оценка: +1
Здравствуйте, Андрей Хропов, Вы писали:

G>> но и делают промышленный софт.


АХ>А как же Common Lisp? Он уж пораспространеннее Erlangа будет в коммерческих приложениях.


Не будет он пораспространеннее Erlang-а в коммерческих приложениях. Даже близко. На Эрланг написано в разы больше коммерческого кода, чем на любом ФЯ, тут даже сравнивать глупо. Простой тест — задайтесь вопросом, какой коммерческий софт обычно ( ) пишут на CLisp, когда думают его коммерчески применить. Для Эрланга несложно ответить на этот вопрос, Lisp же применяется эпизодически где попало. У него даже устоявшейся ниши применений нет. Массово его применяли во времена программы СОИ, в рамках заказов американского министерства обороны. В системах "военного искусственного интеллекта". Даже LISP-процессоры делали. Ушла вместе с Рейганом СОИ — и все. Да и то — коммерческим этот софт можно назвать с большой натяжкой. Он заказной.
Re[7]: Какой функциональный язык стоит изучать?
От: geniepro http://geniepro.livejournal.com/
Дата: 11.03.07 17:10
Оценка: 11 (2)
Здравствуйте, VladD2, Вы писали:

VD>А SICP даже на русском нет.


http://newstar.rinet.ru/~goga/sicp/sicp.pdf
Re: Какой функциональный язык стоит изучать?
От: last shinji  
Дата: 13.03.07 18:52
Оценка:
Здравствуйте, Аноним, Вы писали.

Сейчас пытаюсь изучить схему по scip.
Видимо, моей ошибкой при разборе злых примеров и выполнении упражнений были попытки представить рекурсию в уме.
Не делайте этого без бумажки!

Или это у меня с абстрактным мышлением что-то не в порядке?
Носок исчез в гильбертовом пространстве. Туда ему и дорога.
Re[2]: Какой функциональный язык стоит изучать?
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 13.03.07 19:54
Оценка:
Здравствуйте, last shinji, Вы писали:

LS>Сейчас пытаюсь изучить схему по scip.

LS>Видимо, моей ошибкой при разборе злых примеров и выполнении упражнений были попытки представить рекурсию в уме.
LS>Не делайте этого без бумажки!

Да на первых порах и императивную программу без бумажки трудно представить. А потом...

LS>Или это у меня с абстрактным мышлением что-то не в порядке?


Вот этого точно сказать нельзя (надеюсь, что впроядке ) . Тут нужно не абстрактное мышление (все эти ФЯ-специфические заморочки понятны любому умному человеку), нужна именно привычка думать определённым образом. Некоторые задачи потом в функциональном стиле думаются даже проще, чем в в императивном.
... << RSDN@Home 1.2.0 alpha rev. 672>>
Re[5]: Какой функциональный язык стоит изучать?
От: z00n  
Дата: 14.03.07 17:04
Оценка: +1
Здравствуйте, Mamut, Вы писали:

CC>>Что может быть проще отсутствия синтаксиса (который, соответственно, не надо изучать)?



M>Потому что надо знать, почему я обязан писать так:

M>
M>(quote (1 2 3 4 5))
M>

Тут действует единственное общее правило - первый аргумент списка — это команда, все последующие — ее аргументы.
Поэтому зная, что (quote (1 2 3 4)), ты заодно знаешь, что (fib 20), (+ 1 2), (= 3 4) etc.



M>Для того, чтобы понять, например, следующее выражение, надо знать именно синтаксис и как он работает:

M>
M>(let ((x 2))
M>  (+ x 3))
M>

let — это макрос. Означает он вот что: ((lambda (x)(+ x 3) 2).
Синтаксис тут прежний — команда let принимает аргументы — первый(список-списков): ((x 2)) и второй(выражение): (+ x 3). Синтаксис тут совершенно прежний, а знание того, что let нужно вызывать с двумя аргументами, это не знание синтаксиса, а, скорее, знание API
Re[6]: Какой функциональный язык стоит изучать?
От: Mamut Швеция http://dmitriid.com
Дата: 14.03.07 17:18
Оценка: +1
Все поскипано.

То есть мне все равно надо знать, что списки запихиваются в скобочки, а все это тоже запихивается в скобочки


dmitriid.comGitHubLinkedIn
Re[3]: Какой функциональный язык стоит изучать?
От: last shinji  
Дата: 17.03.07 15:55
Оценка:
Здравствуйте, konsoletyper, Вы писали:

K>Вот этого точно сказать нельзя (надеюсь, что впроядке ) . Тут нужно не абстрактное мышление (все эти ФЯ-специфические заморочки понятны любому умному человеку), нужна именно привычка думать определённым образом. Некоторые задачи потом в функциональном стиле думаются даже проще, чем в в императивном.


Вот как раз сейчас передо мной встал такой вопрос.
Нужно ли представлять рекурсию во всех деталях, или изначально нужно пытаться формулировать задачу в терминах рекурсии, не вдаваясь в детали того, как она развернется и свернется обратно?

Довольно сложно представить в уме рекурсию такого рода:

(define (permutations s) (if (null? s) 
                             (flatmap (lambda (x)
                                        (map (lambda (p) (cons x p))
                                             (permutations (remove x s))))
                                      s)))


а на бумажке лень >_<.

Второй подход выглядит более рационально, но при таком подходе осознание того, как же работает процедура не приходит.
Насколько необходимо такое осознавание?
Носок исчез в гильбертовом пространстве. Туда ему и дорога.
Re[4]: Какой функциональный язык стоит изучать?
От: deniok Россия  
Дата: 17.03.07 17:12
Оценка:
Здравствуйте, last shinji, Вы писали:

LS>Вот как раз сейчас передо мной встал такой вопрос.

LS>Нужно ли представлять рекурсию во всех деталях, или изначально нужно пытаться формулировать задачу в терминах рекурсии, не вдаваясь в детали того, как она развернется и свернется обратно?

LS>Второй подход выглядит более рационально, но при таком подходе осознание того, как же работает процедура не приходит.

LS>Насколько необходимо такое осознавание?

Смотря что понимать под "осознанием". Если имеется ввиду некоторая последовательность исполнения инструкций на уровне операций с элементами списка — то, ИМХО, это рецедив императивного мышления. Но, естественно, нужно понимать что твориться в программе: ага, вот тут map — это значит, что функция, переданная как первый аргумент, применится к каждому элементу списка и породит список результатов применений; ну и т.д.

Мне кажется, здесь лучше "думать" на уровне списков, а не их элементов: выполнили что-то над данным списком и вызвали ту же самую обработку для подсписков на 1 элемент короче, обеспечив правильную "подклейку" результатов этих новых вызовов.

(Блин, сколько в Лиспе скобок (только не бейте, дяденьки))
Re[5]: Какой функциональный язык стоит изучать?
От: deniok Россия  
Дата: 17.03.07 19:56
Оценка:
Почти точное повторение приведённой SICPовской реализации на Хаскелле
permutations :: Eq a => [a] -> [[a]]
permutations [] = [[]]
permutations xs = concatMap (\x -> map (\ys -> x : ys) (permutations (remove x xs))) xs
                    where 
                      remove u us = filter (\x -> x /= u) us
-- concatMap это flatmap, [] это nil, : это cons (в инфиксной форме)
-- remove взят со следующий страницы SICP и хаскеллизован

Внутренние лямбды заменяем сечениями, а избыточные скобки — инфиксным оператором $ (задаёт низкий приоритет для применения функции):
permutations xs = concatMap (\x -> map (x :) $ permutations $ remove x xs) xs
                    where 
                       remove u us = filter (/= u) us

Видим, что remove ни фига не сокращает запись; избавляемся от него:
permutations xs = concatMap (\x -> map (x :) $ permutations $ filter (/= x) xs) xs

Я чуствую, что Трурль бы пошёл дальше в этом, как его, рефакторинге, что ли? О, придумал: рехаскеллинге. И сделал бы permutations полную анлямбду.

Кстати, этот SICPовский permutations странненько будет работать на списке с повторяющимися элементами (из-за того, что remove убирает не 1 элемент, а все элементы с данным значением).
Re[6]: Какой функциональный язык стоит изучать?
От: deniok Россия  
Дата: 17.03.07 21:05
Оценка:
Трурль, наверное, спит; сделаю сам
permutations [] = [[]]
permutations xs = concatMap (permWithFirst xs) xs
                  where
                    -- возвращает все пермутации xs с отброшенным x, а затем
                    -- добавляет этот x в начало каждой пермутации
                    permWithFirst xs x = map (x:) $ permutations $ filter (/=x) xs
Re[7]: Какой функциональный язык стоит изучать?
От: R.K. Украина  
Дата: 17.03.07 21:40
Оценка: 20 (2)
Здравствуйте, deniok, Вы писали:

D>Трурль, наверное, спит; сделаю сам


С ремувами и фильтрами неэффективно и не слишком красиво получается. Вот вариант перестановок получше:

perm [] = [[]]
perm (x:xs) = [ps ++ x:qs | rs <- perm xs, (ps,qs) <- splits rs]

-- эквивалент splits xs = inits xs `zip` tails xs
splits [] = [([], [])]
splits xxs@(x:xs) = ([], xxs) : [(x:ps, qs) | (ps,qs) <- splits xs]
You aren't expected to absorb this
Re[8]: Какой функциональный язык стоит изучать?
От: deniok Россия  
Дата: 17.03.07 23:34
Оценка:
Здравствуйте, R.K., Вы писали:

RK>perm [] = [[]]
RK>perm (x:xs) = [ps ++ x:qs | rs <- perm xs, (ps,qs) <- splits rs]


Ага! Чтобы получить все перестановки x:xs делаем так:
Берём все перестановки xs (это rs), нарезаем их по-всякому (splits), и засовываем x между левым и правым обрезками (ps ++ x:qs).
Класс. Компрехеншен — сила!

RK>-- эквивалент splits xs = inits xs `zip` tails xs
RK>splits xxs@(x:xs) = ([], xxs) : [(x:ps, qs) | (ps,qs) <- splits xs]

A inits и tails — это будут
inits [] = [[]]
inits (x:xs) = [[]] ++ [x:ys | ys <- inits xs]

tails [] = [[]]
tails xxs@(x:xs) = xxs:[ys | ys <- tails xs]
Re[8]: Какой функциональный язык стоит изучать?
От: Tonal- Россия www.promsoft.ru
Дата: 18.03.07 06:41
Оценка:
Здравствуйте, R.K., Вы писали:
RK>С ремувами и фильтрами неэффективно и не слишком красиво получается. Вот вариант перестановок получше:
RK>
RK>perm [] = [[]]
RK>perm (x:xs) = [ps ++ x:qs | rs <- perm xs, (ps,qs) <- splits rs]

RK>-- эквивалент splits xs = inits xs `zip` tails xs
RK>splits [] = [([], [])]
RK>splits xxs@(x:xs) = ([], xxs) : [(x:ps, qs) | (ps,qs) <- splits xs]
RK>

Класс!
Переписал на python получилось только немного длиннее:
def split(xxs):
  if not xxs:
    return [([], [])]
  return [([], xxs)] + [([xxs[0]] + ps, qs) for ps, qs in split(xxs[1:])]

def perm(xxs):
  if not xxs:
    return [[]]
  return [ps + [xxs[0]] + qs for rs in perm(xxs[1:]) for ps, qs in split(rs)]


А вот если попытаться работать с итераторами и генераторами, получается уже не так лаконично:
def split2(xxs):
  xs, xxs = itertools.tee(iter(xxs))
  try:
    x = xs.next()
    yield [], list(xxs)
    for ps, qs in split2(xs):
      yield [x] + ps, qs
  except StopIteration:
    yield [], []

def perm5(xs):
  xs = iter(xs)
  try:
    x = xs.next()
    for rs in perm5(xs):
      for ps, qs in split2(rs):
        yield ps + [x] + qs
  except StopIteration:
    yield []

Хотя ленивость иногда стоит того!
... << RSDN@Home 1.2.0 alpha rev. 675>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.