Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.06.03;
Скачать: [xml.tar.bz2];

Вниз

Функциональные языки.   Найти похожие ветки 

 
ferr ©   (2007-05-03 23:28) [0]

Ваше отношение к ним?


 
Карелин Артем ©   (2007-05-03 23:40) [1]

это какие конкретно?


 
ferr ©   (2007-05-03 23:40) [2]

Lisp, Haskell, OCaml


 
ArtemESC ©   (2007-05-03 23:44) [3]

Pascal - совершенство, остальное ... .


 
ferr ©   (2007-05-03 23:55) [4]

Мне вот лично особой разницы в императивных языках нету, C++, Pascal, Java, C#.. на чём-то приятнее и быстрее пишется, на чём-то медленнее и грабельнее, но в общем разница несущественна.

Что же касается функциональных языков -- это совершенное другое программирование. ФЯ-и включая в себя лямбда-исчисление позволяют получать интересные результаты "малой кровью". Понятно что у этих языков есть свои ниши применения, будь то программирование искуственного интеллекта или программ для сапр.. Но вот писание гуёв на этих языках это по-моему извращенство.

Тему подниманию в связи с весенним обострением линуксоидов. От них часто слышишь что программы надо писать так: критические по скорости участки кода на C, а оболочку на Haskell"е или Python"e.


 
TUser ©   (2007-05-04 00:48) [5]

> Ваше отношение к ним?

Все собираюсь поосваивать, но пока увы.


 
Real ©   (2007-05-04 00:49) [6]


> Ваше отношение к ним?

Не отношусь к ним


 
Piter ©   (2007-05-04 02:01) [7]

а можно объяснить в двух словах, чем функциональный язык отличается там от "обычных", типа D и C++? На примере было бы круто.


 
Думкин ©   (2007-05-04 05:38) [8]

(defun my (x) (if (zerop x) (x) (if (< 0 x) (+ x 1) (- x 1))))

function my (x : integer) : integer;
begin
       if x = 0 then Result := x
       else if x>0 then Result := x + 1
                     else  Result := x - 1
end;


Сейчас изучаю Lisp, до вкусностей пока не добрался хотя уже перелопатил более 200 страниц убористого английского текста. Пока забавно - вот и все отношение. А подвигла к этому статья предлагавшаяся на этом сайте:
http://www.nestor.minsk.by/sr/2003/07/30710.html

Хочется попробовать. При чем тут линуксоиды со своим отнюдь не только весенним обострением - я не знаю.


 
ShaggyDoc   (2007-05-04 06:40) [9]

LISP - это совершенно другой образ мышления. Тем, кто привык к Pascal, трудно понять, например, отсутствие объявления типов. Разумеется, нельзя противопоставлять языки - каждому свое. О LISP, как языке "искусственного интеллекта" любят рассуждать те, кто пишет (цитата из другого форума)
"...если натуральный ителлект много лет учат сначала основному языку.."
Те, "кто ителлект учат".

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

(defun ru-transpose (lst)
(apply "mapcar (cons "list lst))
)


Это пользовательская функция, транспонирующая список - меняет местами значение столбцов и колонок. Внутри нет ни одной локальной переменной. apply, mapcar, cons и list - базовые стандартные функции языка, а не какой-то библиотеки или диалекта.

Я, например, использую ее для транспонирования данных, полученных в результате SQL-запроса. Список LST тоже формируется LISP, но это неважно. Главное - он может содержать данные любых типов.

Напишите такое же на Pascal, не используя никаких посторонних библиотек, а только базовые функции языка, независимые от реализации. Конечно, я не утверждаю, что этого нельзя.


 
Думкин ©   (2007-05-04 06:58) [10]

> LISP - это совершенно другой образ мышления.

T and NIL are so basic to Lisp that if you ask a really dedicated Lisp
programmer a yes-or-no question, he may answer with T or NIL instead of
English. (‘‘Hey, Jack, want to go to dinner?’’ ‘‘NIL. I just ate.’’)


:)

> Напишите такое же на Pascal, не используя никаких посторонних библиотек, а только базовые функции языка, независимые от реализации.

Это понятно, но разве плюс языка в том, что допускает краткость? В таком бы случае ассемблер ползал в самом низу иерархии. Библиотеки спасают таки. Иесли я не могу в базовом, а могу используя библиотеку - то вряд ли это ухудшит возможности языка. Все-таки главное, видимо немного в ином.

А так это первым делом и приводят:
A Lisp programmer can immediately concentrate on the problem he or she wants tosolve. A Pascal or C programmer faced with the same problem must first go off and implement parts of a Lisp-like system, such as linked list primitives, symbolic data structures, a storage allocator, and so on, before getting to work on the real problem.

Хотя программисты и Си и Паскаля, давным давно поступают точно также.


 
ShaggyDoc   (2007-05-04 08:07) [11]


> Библиотеки спасают таки. Иесли я не могу в базовом, а могу
> используя библиотеку - то вряд ли это ухудшит возможности
> языка. Все-таки главное, видимо немного в ином.

Согласен. Без библиотек никуда. Возможность использования библиотек и их наличие более влияет на потребительские качества любой системы, чем синтаксис языка. У меня для LISP около 2000 собственных функций, которые многократно облегчают работу. Но в LISP можно, используя не более десятка "супербазовых" функций работы со списками и функцию eval достаточно просто создать вообще свой диалект.

Да, главное в ином. Одно из главных отличий в LISP в том, что он может "самомодифицировать" код. В LISP нет операторов, нет процедур. Нет "управляющих конструкций". Но есть функции.

Есть списки и атомы. Программа является функцией. Функция является списком. Функция что-то возвращает и этот результат можно использовать напрямую, не присваивая значения какой-то переменной. Хотя можно и переменную использовать - это уж вопрос стиля.

В общем, совершенно иная "религия". В каких-то "отраслях" удобнее , в каких-то  нет.

Отличие особенно заметно при программировании для AutoCAD. Туда, на кой-то черт воткнули VBA (при наличии возможности программирования на LISP, C++, Delphi). Соответственно в документации тьма примеров использования VBA. Любое элементарное действие - код на страницу.


 
Alkid ©   (2007-05-04 08:28) [12]

Что касательно ФЯ. Мне понятно как на них писать (под)программы, где есть чёткие входные данные и надо из них получить выходные. Но мне не понятно, как писать интерактивные программы на ФЯ, ибо они исповедую stateless-идеологию (неизвменяемые данные), а любой внешний мир (пользователь, система) - это по определению stateful-вещь.


 
GDProg   (2007-05-04 09:16) [13]

Очень рекомендую: http://www.lib.ru/CTOTOR/FUNCPROG/
Математика там зубодробительная, по несколько раз приходится перечитывать, чтобы понять, да и текст, на мой взгляд, не всегда отличается ясностью изложения, но ничего сравнимого по полноте изложения на русском языке я пока не видел.

Ещё на русском есть http://rsdn.rsdn.ru/article/haskell/haskell_part1.xml - описание языка Хаскель, который считается одним из самых чистых функциональных языков. А вот Лисп назвать образцовым ФЯ нельзя - только первая его версия была чисто функциональной, а все последующие уже приобрели некоторые императивные черты.

Ещё можно почитать форум здесь: http://www.delphikingdom.com/asp/talktopic.asp?ID=366 - там куча ссылок по теме.


 
ShaggyDoc   (2007-05-04 11:52) [14]

Не буду ввязываться в дискуссии о функциональности или императивности.

Мне непонятно упоминание о "неизменяемости данных" и о непонятности, как писать интерактивные программы.

На картинке - диалоговое окно.

http://cad.kurganobl.ru/assets/images/rucad/xml_menu_new.jpg

Программа интерактивная? Явно.

Вот еще пример:

http://cad.kurganobl.ru/assets/images/rucad/lsp/_ru-dlg-coord-edit-2d.jpg

В то же время эти диалоговые окна работают внутри LISP-функций, которые что-то делают, изменяют данные и возвращают результат.

Все это сделано в VisualLISP. При этом сами диалоги - на Delphi, но функция об этом не знает. Заодно и дерево меню, показанное на первом рисунке написано на XML. А внутри значений атрибутов - LISP-выражение, которое обрабатывается при выборе пункта иллюстрированного меню.

Здесь сочетание нескольких технологий и мне, вообще-то, все равно, как они оцениваются с теоретической точки зрения.

Что-такое "некоторые императивные черты" мне непонятно. Но точно известно, что и на LISP конкретный человек "измученный нарзаном" может написать "по-бейсиковски", то есть последовательно назначая переменные, присваивая им значения, используя потом в выражениях. Но это не свойство языка.


 
ferr ©   (2007-05-04 13:19) [15]

А я вот за хаскель взялся.. Интересно, забавно, но вот назвать это практичным язык не поворачивается.

Примеры кому-то там надо было:

1) иллюстрирует "наглость" работы с функциями
Hugs> (foldr1 (.) [(\x -> x + 1), (\x -> x^2)]) 2
5

имеем 2 лямбда-терма [(\x -> x + 1), (\x -> x^2)] (суть обычные функции). Далее командой foldr (.) [..] применяем к ним операцию композиции. После чего вызываем функцию для 2. 2^2 + 1 = 5.

// появление лямбда обещается и в с# 3.0.

2) иллюстрирует возможность работы с бесконечными списками.
Hugs> [x^2 | x <- [1,2..]]
программа которая будет выводить квадраты всех натуральных чисел.. Пока вы её не остановите ;-)

а мы выведем сумму квадратов натуральных чисел таких что эти квадраты <=100 :

Hugs> takeWhile (<=100) [x^2 | x <- [1,2..]]
[1,4,9,16,25,36,49,64,81,100]


теперь их перемножим:
Hugs> foldr1 (*) (takeWhile (<=100) [x^2 | x <- [1,2..]])
13168189440000


... больше в книжках ;-)


 
Галинка ©   (2007-05-04 16:10) [16]

очень хорошие языки. Все уже придумано. Но после "универсальных" надо мозги немного ломать.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2007.06.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.04 c
2-1179046582
IPE
2007-05-13 12:56
2007.06.03
current user name


6-1158036070
DelphiN!
2006-09-12 08:41
2007.06.03
Отключить кеширование при открытии страницы в TWebBrowser-e


4-1167029043
leonidus
2006-12-25 09:44
2007.06.03
Копирование выделенного текста в буфер


2-1178863950
allucard
2007-05-11 10:12
2007.06.03
Ресурсы ехе


3-1173862302
DSKalugin
2007-03-14 11:51
2007.06.03
как в Delphi использовать VBA-функцию Access?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский