9 Страницы < 1 2 3 4 5 > »   
Ответить Создать тему

Функциональное программирование

Imp
post Dec 27 2009, 17:34 
Отправлено #31


Ъ

Сообщений: 4 518
Из: Пуэрто-Принцеса



Цитата(itROOT @ Dec 27 2009, 16:37)
Спросили про _промышленную_ разработку.
*

Про промышленную я уже говорил - Erlang например.
Profile CardPM
  0/0  
foo-bar
post Jan 18 2010, 16:08 
Отправлено #32


Активный

Сообщений: 1 370



Цитата(Imp @ Nov 22 2009, 18:33)
На Lisp'е много проектов крупных (AutoCAD один только чего стоит, он сам не на лиспе, но лисп там активно используется).
*
Я вот
тут уже подметил, что разработчики AutoCAD нынче в сторону .NET смотрят.
Profile CardPM
  0/0  
Imp
post Jan 18 2010, 19:29 
Отправлено #33


Ъ

Сообщений: 4 518
Из: Пуэрто-Принцеса



Цитата(foo-bar @ Jan 18 2010, 16:08)
Я вот
тут уже подметил, что разработчики AutoCAD нынче в сторону .NET смотрят.
*

Ну это сейчас ситуация такая что народ не хочет учить Lisp а просит .NET вот они и потакают. Это не в коем случае не говорит о том, что .NET для этого применения лучше чем Lisp. В Erricson'е тоже не все на Erlang'е пишут.
Profile CardPM
  0/0  
foo-bar
post Jan 19 2010, 11:43 
Отправлено #34


Активный

Сообщений: 1 370



Не хочет народ учить Лиспа! Знакомый работал в конторе, занимающейся разработкой расширений автокада. У них наследие на Лиспе было, вот они плевались на него: код раздутый, все завязано на сайд-эффекты и т.п. Никто у них так и не стал учить его, благо им только логику понять да баги кое-какие пофиксить надо было, а так они на плюсах вроде писали.

PS: проблема конечно на самом деле не в Лиспе была smile.gif
Profile CardPM
  0/0  
jem
post Feb 16 2010, 12:08 
Отправлено #35


Активный

Сообщений: 4 908



Попробовал кое-что на Haskell`е, с подачи Imp`а, так сказать. Очень выразительно получается. Проникся, в-общем. Попробую освоить.

--------------------
C, Clojure(Script), Common Lisp, ECMAScript, Haskell, Java, Lua, Perl, PL/SQL, Python, Scala, SQL, Transact-SQL.
Profile CardPM
  0/0  
Imp
post Feb 16 2010, 18:23 
Отправлено #36


Ъ

Сообщений: 4 518
Из: Пуэрто-Принцеса



jem, ага только начать стоит с того чтобы забыть все что знал до этого.
Profile CardPM
  0/0  
jem
post Feb 20 2010, 14:03 
Отправлено #37


Активный

Сообщений: 4 908



Вот несколько вещей, сходу мне понравившихся (не удержался, чтобы не добавить, хотя сделать это нужно было сразу smile.gif)
Исходный код
>let qsort [] = []; qsort (x:xs) = qsort [y | y <- xs, y < x] ++ [x] ++ qsort [y | y <- xs, y >= x]
>
>qsort [43, 40, 85, 64, 8, 927, 22, 39, 9, 48, 2, 58, 2]
[2,2,8,9,22,39,40,43,48,58,64,85,927]
>
>let fibonacci@(_:fibs) = 1 : 1 : zipWith (+) fibonacci fibs
>
>take 25 fibonacci
& #91;1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,177
11,28657,46368,75025]
>
>let saxpy alpha xs ys = zipWith (\ x y -> alpha * x + y) xs ys
>
>saxpy 2.0 [1..20] [1..20]
[3.0,6.0,9.0,12.0,15.0,18.0,21.0,24.0,27.0,30.0,33.0,36.0,39.0,42.0,45.0,48.0,51.0,54.0,57.0,60.0]
>


Я, кстати, вот о чем подумал в процессе изучения языка: при текущем развитии процессоростроения, когда уже возможны процессоры с сотней-другой ядер, на которых к тому же возможно выполнение нескольких инструкций одновременно, должен встать вопрос о том, как разрабатывать такой софт, который эффективно использует все эти вычислительные устройства. И тут, имха, на первый план должны выйти языки с "естественной" распараллеливаемостью, функциональные, например, вот такие как Haskell. Так что есть смысл освоить функциональную парадигму.

--------------------
C, Clojure(Script), Common Lisp, ECMAScript, Haskell, Java, Lua, Perl, PL/SQL, Python, Scala, SQL, Transact-SQL.
Profile CardPM
  0/0  
Imp
post Feb 20 2010, 22:38 
Отправлено #38


Ъ

Сообщений: 4 518
Из: Пуэрто-Принцеса



Это
Исходный код
let fibonacci@(_:fibs) = 1 : 1 : zipWith (+) fibonacci fibs
я бы написал так:

Исходный код
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)


А это
Исходный код
let saxpy alpha xs ys = zipWith (\ x y -> alpha * x + y) xs ys
вот так:

Исходный код
saxpy alpha xs ys = zipWith (+) (map (alpha*) xs) ys


или так:

Исходный код
saxpy alpha xs ys = zipWith (+) ys $ map (alpha*) xs


let кстати только в интерпретаторе нужен, в файле можно без него на верхнем уровне. Потому что в интерпретаторе все происходит в do блоке монады IO.

Сообщение отредактировал Imp - Feb 20 2010, 22:55
Profile CardPM
  0/0  
Imp
post Feb 20 2010, 22:53 
Отправлено #39


Ъ

Сообщений: 4 518
Из: Пуэрто-Принцеса



qsort лучше так написать:
Исходный код
qsort [] = []
qsort (x:xs) = qsort (filter (<x) xs) ++ [x] ++ qsort (filter (>=x) xs)
Profile CardPM
  0/0  
jem
post Feb 23 2010, 12:16 
Отправлено #40


Активный

Сообщений: 4 908



Imp, согласен по двум пунктам. У вас qsort и fibonacci и проще и нагляднее, но мне в них понравилась некая изюминка, так сказать. В случае с qsort - определение функции один в один аналогично математическому определению алгоритма. А в fibonacci - хитрая замена tail.

А по saxpy есть вопрос: правильно ли я понимаю, что ввиду ленивости Хаскеля по xs будет выполнен один проход? Но в любом случае, в моем варианте основная операция (Scalar Alpha X Plus Y) видна невооруженным глазом (хотя может быть оно и не нужно, ибо из названия это и так ясно), а в вашем случае нужно чуть повтыкать.

Цитата(Imp @ Feb 20 2010, 22:38)
let кстати только в интерпретаторе нужен
*

А вы думаете, откуда этот листинг? smile.gif

Цитата(Imp @ Feb 20 2010, 22:38)
что в интерпретаторе все происходит в do блоке монады IO.
*

Я это подозревал.

Сообщение отредактировал jem - Feb 23 2010, 12:21

--------------------
C, Clojure(Script), Common Lisp, ECMAScript, Haskell, Java, Lua, Perl, PL/SQL, Python, Scala, SQL, Transact-SQL.
Profile CardPM
  0/0  
Imp
post Feb 23 2010, 16:20 
Отправлено #41


Ъ

Сообщений: 4 518
Из: Пуэрто-Принцеса



Цитата(jem @ Feb 23 2010, 12:16)
Imp, согласен по двум пунктам. У вас qsort и fibonacci и проще и нагляднее, но мне в них понравилась некая изюминка, так сказать. В случае с qsort  - определение функции один в один аналогично математическому определению алгоритма.
*

Ну чтобы было соответственно математическому описанию нужно x<-xs трактовать как x∈xs. Тогда да. В принципе оно так и трактуется.
Цитата(jem @ Feb 23 2010, 12:16)
А в fibonacci - хитрая замена tail.
*

fibonacci@(_:fibs) - это называется pattern matching но наверно можно выбрать более наглядный пример.
Цитата(jem @ Feb 23 2010, 12:16)
А по saxpy есть вопрос: правильно ли я понимаю, что ввиду ленивости Хаскеля по xs будет выполнен один проход? Но в любом случае, в моем варианте основная операция (Scalar Alpha X Plus Y) видна невооруженным глазом (хотя может быть оно и не нужно, ибо из названия это и так ясно), а в вашем случае нужно чуть повтыкать.
*

Да будет в один проход. Да иногда полезно когда формула видна в коде, я просто хотел показать что не всегда нужно вводить новые имена и писать лямбды, почти всегда можно без этого обойтись. Так называемый pointfree style. А повтыкать - это вопрос привычки.
Цитата(jem @ Feb 23 2010, 12:16)
А вы думаете, откуда этот листинг? smile.gif
*

Листинг то из интерпретатора это и так понятно, но с точки зрения Haskell как языка let не нужен.
Profile CardPM
  0/0  
jem
post Feb 24 2010, 18:58 
Отправлено #42


Активный

Сообщений: 4 908



Цитата(Imp @ Feb 23 2010, 16:20)
Листинг то из интерпретатора это и так понятно, но с точки зрения Haskell как языка let не нужен.
*

Мне не понятно, зачем вы вообще про let заговорили. Я-то его использовал именно потому, что работал интереактивно с интерпретатором. А как он используется в скриптах, и где нужен, в любом букваре написано.

Цитата(Imp @ Feb 23 2010, 16:20)
это называется pattern matching
*

То же касается и сопоставления с образцом.

А "хитрую замену", кстати, если вы не поняли, следует понимать как "финт ушами".

Цитата(Imp @ Feb 23 2010, 16:20)
Так называемый pointfree style
*

Попробовал тулзу - на выходе такой космос получается.

--------------------
C, Clojure(Script), Common Lisp, ECMAScript, Haskell, Java, Lua, Perl, PL/SQL, Python, Scala, SQL, Transact-SQL.
Profile CardPM
  0/0  
Imp
post Feb 24 2010, 20:14 
Отправлено #43


Ъ

Сообщений: 4 518
Из: Пуэрто-Принцеса



Цитата(jem @ Feb 24 2010, 18:58)
Мне не понятно, зачем вы вообще про let заговорили. Я-то его использовал именно потому, что работал интереактивно с интерпретатором. А как он используется в скриптах, и где нужен, в любом букваре написано.
*

Просто указал что он не нужен в обычных условиях, чтобы у людей не складывалось впечатление что Haskell это как бейсик где перед обьявлениями нужно писать let. Еще в интерпретаторе вы можете написать let a=2, а потом let a=3, но без let вы такое не напишете. Так что это не просто такой необязательный элемент синтаксиса.
Цитата(jem @ Feb 24 2010, 18:58)
То же касается и сопоставления с образцом.
*

ну это тоже не для вас разъяснение, а для других читателей форума. Это кстати не только для Хаскелля специфичная конструкция. В python'е тоже есть pattern matching, только гораздо более примитивный.
Цитата(jem @ Feb 24 2010, 18:58)
А "хитрую замену", кстати, если вы не поняли, следует понимать как "финт ушами".
Попробовал тулзу - на выходе такой космос получается.
*

Ну "космос" это с непривычки smile.gif

Не воспринимайте, пожалуйста, мои ответы на свой счет как критику или что-то подобное, я просто пытаюсь объяснить некоторые моменты, чтобы было понятно другим читателям форума, ну возможно немного поделится опытом. Это ни в коей мере не значит что мой вариант "лучше" или "правильней", чем ваш, просто я показываю как можно написать по другому. Возможно, мой тон несколько менторский, но это у меня просто такая привычка.
Profile CardPM
  0/0  
Imp
post Feb 24 2010, 20:16 
Отправлено #44


Ъ

Сообщений: 4 518
Из: Пуэрто-Принцеса



С pointfree тоже нужно меру знать (я ее иногда превышаю) smile.gif
Profile CardPM
  0/0  
Imp
post Feb 24 2010, 20:20 
Отправлено #45


Ъ

Сообщений: 4 518
Из: Пуэрто-Принцеса



Вот для иллюстрации pattern matching'а выкладываю свое определение булевского типа и 3х операций над ним && || и not
Исходный код
data Bool = True | False

infixr 3 &&
infixr 2 ||

True && True = True
_ && _ = False

False || False = False
_ || _ = True

not True = False
not False = True
Profile CardPM
  0/0  

9 Страницы < 1 2 3 4 5 > » 
ОтветитьTopic Options
1 чел. читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
Быстрый ответ
Кнопки кодов
 Расширенный режим
 Нормальный режим
    Закрыть все тэги


Открытых тэгов: 
Введите сообщение
Смайлики
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
         
Показать все

Опции сообщения