LINUX.ORG.RU

Функциональное программирование на Haskell : Часть 1. Введение

 


0

0

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

>>> Подробности

★★★

Проверено: boombick ()
Ответ на: комментарий от anonymous

> Поэтому многие согласились бы разрабатывать на этом языке даже за гораздо меньшую оплату, чем 100000 руб/мес, особенно взамкадье.

Это потому, что им ни за какой язык ни копеечки не предложат. Они ничего не умеют, они бесполезны. Зато про монады могут с умным видом троллить.

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

lisprocks
()
Ответ на: комментарий от pitekantrop

Еб@л я в рот pattern matching, если топикстартер в первом же вводном параграфе приводит абсолютно необъяснимый кусок кода. Нафига вообще тогда писать эти статьи?

xintrea
()
Ответ на: комментарий от pitekantrop

> Тогда единственное, что тебе подходит — это 1С.

Ой не надо. И по Java, и по C++ и по Delphi тонны литературы на хорошем, чистом русском языке. В любой книжной лавке любого замкадного городка полно. Потому что они нужны. А по хацкилю литературы нет и не будет, кроме сделанных фанатиками переводиков статеек. Угадайте, почему?

lisprocks
()
Ответ на: комментарий от Stanson

> А конкретные, практические задачи на нём решать можно?

Нельзя

Очень математические, если уж на то пошло.

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

и данные буферизовать

Никак. Он же «чистый». Только кошерные, немутабельные структуры данных. С неопределенным временем доступа.

lisprocks
()
Ответ на: комментарий от SV0L0CH

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

lisprocks
()
Ответ на: комментарий от xintrea

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

fac - похож на «символьный идентификатор ф-ии»:

fac для параметра 0 = 1 fac для любых других параметров n = n * fac(n-1)

anonymous
()
Ответ на: комментарий от lisprocks

Ктото всё есчё читает бумажные книги/газеты/etc?

Тяжёлый случай :(

SV0L0CH
()
Ответ на: комментарий от lisprocks

>> А конкретные, практические задачи на нём решать можно?

Нельзя

Худеть! Срочно худеть!

SV0L0CH
()
Ответ на: комментарий от SV0L0CH

> Ну я бы тут подключил внешнюю библиотеку для управления сокетами(а скорее просто установил нужный модуль(с сетями на хаскеле дела не имел)).

Как именно это будет выглядеть на хаскеле? Ну что написать надо?

Хочу факториал - пишу
fac 0 = 1
fac n = n * fac (n-1)
Это понятно.

Хочу из сокета читать.
Что нужно написать, чтобы открыть сокет, проверить, есть ли там данные, если есть - прочитать в буфер, если нет, продолжать делать фурье над буфером.

Пример кода для этого хочу.

Ладно, хрен с ним, с сокетами. Такую простую вещь хочу - кольцевой буфер. Ну или если уж всё совсем функционально и абстрактно, то банальный fifo - записать туда байт, прочитать оттуда байт. И чтоб первый записанный байт прочитался оттуда первым, и чтоб можно было в некий момент записать туда 3 а прочитать только 1, и чтоб остальные 2 ждали своего часа для БПФ которое понятно как написать.

Stanson ★★★★★
()

http://www.cs.utah.edu/~hal/docs/daume02yaht.pdf и не надо быть ктн или кфмн или кем-то ещё внутри англицкий на уровне младшего школьного возраста. если уж дико охота на русском: есть Душкин, гугл в помощь

anonymous
()
Ответ на: комментарий от SV0L0CH

Т.е. в итоге собственно код некоего простенького сервачка, который в реальном времени делает БПФ будет выглядеть как-то так:

send_out( listen( «0.0.0.0:55555» ) fifo ( my_fft ( fifo ( recv_in ( listen ( «0.0.0.0:55556» ) ) ) ) ) )

а всякие там listen будут выглядеть как
listen addr = do
... тупой линейный код с обычными open, connect, accept
return socket
?

так это и на C так можно писать, просто неудобно.
И асинхронность как же? Оно ж пока recv_in не сделает, никакого my_fft не получится, да и хватит оного сервачка только на одно соединение.
Или я как-то не так всё это понимаю?
Ну хотя бы приблизительно - в чём смысл этой охоты?

Stanson ★★★★★
()
Ответ на: комментарий от anonymous

Ну а выглядит-то это как в коде?

Если это выглядит красиво и наглядно и получается удобочитаемый и удобоподдерживаемый код - то почему бы и нет, а если оно ужасно или банально, то возникает такой вопрос:
А не является ли Хаскель чем-то вроде какой-нибудь совершенно умозрительной и сугубо академической «теории суперструн» (к примеру) которая может и интересна матфизику, чисто как зарядка для ума и способ получения грантов, но совершенно неприменима для реальных вещей? При этом, конечно, оный матфизик может использовать парочку математических выкрутасов из любимой теории в какой-нибудь «системе расчёта экономических параметров рынка», создание которой ему предложили в качестве халтурки, но это совсем не будет означать, что вся его теория хотя бы достойна какого-либо внимания, уж не говоря о необходимости её изучения и применения на практике.

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

Выглядит красиво. И, как ни странно, та же самая функциональность занимает меньше строк кода, чем на Си. Примеры можешь посмотреть в RWH

anonymous
()
Ответ на: комментарий от Stanson

Это вы поторопились! На второй странице треда и про суперструны. Обычно они плавно вытекают на пятой или шестой.

valich ★★★
()
Ответ на: комментарий от valich

Что поделаешь, вещества изнутри напирают. Сил нет терпеть.

twoflower
()
Ответ на: комментарий от Stanson

> А конкретные, практические задачи на нём решать можно? Очень математические, если уж на то пошло.

можно, но сложно, как только сталкиваешься с «грязным» кодом. Монады? Нет спасибо. Наверно это очень круто, но не подойдет для промышленного применения. Где найти столько «средних» девелоперов, которые будут это понимать? А главное потом поддерживать. Гораздо проще найти несколько средненьких C/C++ девелоперов + одного эксперта к ним + процессы. Я честно пытался написать что-то не сильно сложное, но в тоже время реальное, мозг сломал. Хотя до этого около года ковырял Хаскель на досуге. В итоге реализовал это на Erlang. Получилось просто и быстро.

P.S. ИМХО, когда собирается толпа математиков-теоретиков, которые пытаются сделать абсолютный функциональный язык, все это заканчивается академическим языком. Другое дело C++, Erlang, etc которые создавались для конкретных практических целей...

P.P.S. Мы тестера грамотного не можем уже пол-года найти... а тут монады.

dmitryme
()
Ответ на: комментарий от Stanson

> А конкретные, практические задачи на нём решать можно? Очень

математические, если уж на то пошло.

надо в faq добавить
«Можно ли на хаскеле решать практические задачи?»
Можно.
«Можно ли на хаскеле писать GUI под винду?»
Можно.
«Можно ли писать gui на gtk, qt, wxwidgets?»
Можно.
«Можно ли на хаскеле ...?»
Можно. Это универсальный ЯП.

> какой-нибудь TCP_KEEPALIVE на сокете выставить

http://hackage.haskell.org/packages/archive/network/2.2.1.4/doc/html/Network-...

> семафорить

http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Concurrent...

> другим нитям

http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Concurrent...

> сокет поллить

http://hackage.haskell.org/packages/archive/network/2.2.1.4/doc/html/Network-...

данные буферизовать
http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Concurrent...

anonymous
()
Ответ на: комментарий от kristall

> Да и кстати, удивляет полный игнор сообществом свежей книги Худака «The Haskell School of Musik» которая по моему есть в сободном доступе.

Здорово! Спасибо. Его School of Expression хороша была.

undet
()
Ответ на: комментарий от undet

Хм. Похоже, это совсем то же самое, но только про музыку.

undet
()
Ответ на: комментарий от Divius

>Но нужен _только_ для вычислений
а на нём MPI можно делать?

dimon555 ★★★★★
()
Ответ на: комментарий от dmitryme

> Где найти столько «средних» девелоперов, которые будут это понимать?
На любой «программерской» специальности минимум семестр под функциональное программирование отводится. Даже если там изучают ML, SML, Miranda, а не haskell, не важно, принципы одни. Посмотрите в диплом специалиста и прочитайте сколько часов он этим занимался и какую оценку получил на экзамене. Чем вам не «средний» девелопер?
Я уже не говорю что за 5 лет ничегонеделания невозможно изучить и С++, а за 5 лет активного самообразования можно изучить 20 хаскелей.

> ИМХО, когда собирается толпа математиков-теоретиков, которые пытаются

> сделать абсолютный функциональный язык, все это заканчивается

> академическим языком. Другое дело C++, Erlang, etc которые

> создавались для конкретных практических целей...

Именно так всё и начиналось, однако через ~10 лет после начала разработки haskell, им заинтересовались и инженеры, и допилили до практической применимости.
Открытость инструментария сделала своё: теперь существует огромное множество открытых прикладных утилит и библиотек. И вся эта инфраструктура стремительно развивается с каждым годом.

anonymous
()
Ответ на: комментарий от pitekantrop

Не, спасибо. Я пока жабкой перебиваюсь. И, более того, мануалы на английском таки читаю, но не «аки художественный текст на русском», чуть сложнее дается - это было единственное возражение.

Toll ★★
()
Ответ на: комментарий от Karapuz

>>Если нужно считать быстро, то лучше уж на С

Intel, AMD, IBM, NVIDIA, и даже Sun согнулись поперек, от смеха. LOL. Им-то спешить некуда, и поэтому они разрабатывают фреймворки для научных расчетов http://ppl.stanford.edu/wiki/index.php/Projects на.... чем бы ты думал?

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

Toll ★★
()
Ответ на: комментарий от Stanson

> молчит о том, как данные для этих функций в программу получить и как потом куда-нибудь выдать.

Тссссссс. Это табу. В мире функционального программирования, в мире строгой математики, в мире чистых идей не принято получать и отдавать бох весть что куда ни попадя. А то так можно и до программиста докатиться.

LamerOk ★★★★★
()
Ответ на: комментарий от valich

>Это вы поторопились! На второй странице треда и про суперструны. Обычно они плавно вытекают на пятой или шестой.

Дык, тред вяленький, пятой-шестой страницы не будет.

Toll ★★
()
Ответ на: комментарий от kristall

> Пятинконтроп не нужен.

Кому-то не нужен, а вот некоторым фанатикам очень даже нужен. Они с помощью этой сказочки пытаются доказать свои дарвинистские бредни.

lisprocks
()
Ответ на: комментарий от anonymous

> На любой «программерской» специальности минимум семестр под функциональное программирование отводится.

Зачем чушь говорить?

а за 5 лет активного самообразования можно изучить 20 хаскелей.

На фиг не нужен работничек, потративший 5 лет на «активное самообразование». Нужен работничек, который 5 лет работал. Делал что скажут, и делал это хорошо и в срок.

lisprocks
()
Ответ на: комментарий от lisprocks

> Они с помощью этой сказочки пытаются доказать свои дарвинистские бредни.

Ви таки верите в теорию разумного дизайна?

PolarFox ★★★★★
()
Ответ на: комментарий от lisprocks

> А это и не код. Это уравнение. Почему ты рассматриваешь его как код, и ищешь там алгоритм? Там ничего этого нет.

Это код дорогой товарищ. Любое символьное выражение какого-либо понятия в определенной мнемотике (например уравнения) является кодом.

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

xintrea
()
Ответ на: комментарий от PolarFox

> Ви таки верите в теорию разумного дизайна?

Я не верю в бредни и сказки. Дарвинизм в гораздо большей степени основан на лжи и бреде, чем традиционные взгляды на генезис жизни.

lisprocks
()
Ответ на: комментарий от lisprocks

Постой. Дарвинизм оправдывает лишь развитие жизни от простых форм к сложным, а про зарождение жизни совсем другие сказки и общепринятой теории нет.

PolarFox ★★★★★
()
Ответ на: комментарий от xintrea

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

Да это и не удивительно. Бешенов то сам поди новичок в Хаскелле. Годика наверное пол - годик изучает вот и написал статью. А смысл?

kristall ★★
()
Ответ на: комментарий от PolarFox

> Дарвинизм оправдывает лишь развитие жизни от простых форм к сложным

А это не сказочка, само по себе? Там все основано на лжи и подтасовках, со всеми этими «австралопитеками», «питекантропами» и прочими «неандертальцами».

lisprocks
()
Ответ на: комментарий от PolarFox

Достаточно одной маленькой лжи, чтобы был повод заподозрить в лжи большей. От дарвинистов этих маленьких обманов было предостаточно.

lisprocks
()
Ответ на: комментарий от lisprocks

Даже если конкретные доказательства были подделаны, то это не значит что теория врёт. По крайней мере эволюция логична.

PolarFox ★★★★★
()
Ответ на: комментарий от xintrea

module Main where

-- Чистая функция
fac :: Integer -> Integer  — сигнатура типа
fac 0 = 1  — fac от 0 равен 1
fac n = n * fac (n-1)  — fac от любого другого числа n равен n*fac (n-1)

-- Взаимодействие в внешним миром
main = do
number <- readLn
let result = fac number
print result

anonymous
()
Ответ на: комментарий от PolarFox

> Даже если конкретные доказательства были подделаны, то это не значит что теория врёт.

В суде такая отмазка не проканает. Хотя бы один поддельный аргумент - и вся защита или обвинение рушится.

По крайней мере эволюция логична.

Да ну? Как раз логикой тут и не пахнет. Что может быть бредовее, чем идея о «полезных» мутациях, которые из простого делают сложное?

lisprocks
()
Ответ на: комментарий от PolarFox

А мне представляется это чем то вроде дерева. Есть разные веточки, одни усыхают и отпадают, другие вырубают, третьи появляются. Так примерно. Кстати если не ошибаюсь мозг неандертальца был на 30 процентов примерно больше мозга кроманьонца. Так что скушали мы неандертальцев вот и весь сказ.

kristall ★★
()
Ответ на: комментарий от lisprocks

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

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

PolarFox ★★★★★
()
Ответ на: комментарий от PolarFox

> Мутации происходят. Неоспоримый факт. Что мешает хотя бы одному проценту оказываться полезными?

Одному проценту мешает оказаться полезным то, что никто еще не наблюдал полезной мутации. Наблюдались только бесполезные и убийственные.

Предоставленная сама себе природа только саморазрушается (в полном согласии со вторым законом термодинамики). Всегда требуется разумное вмешательство для того, чтобы починить сломанное или создать новое.

lisprocks
()
Ответ на: комментарий от lisprocks

> Предоставленная сама себе природа только саморазрушается (в полном согласии со вторым законом термодинамики). Всегда требуется разумное вмешательство для того, чтобы починить сломанное или создать новое.

Внешнее влияние, насколько мне известно, было применено при:

• Возникновении жизни

• Разделении на царства растений/грибов и животных

• Гибели динозавров и большинства крупных животных

• Создании человека.

Остальное происходило с помощью эволюции. Наличие в траве только зелёных кузнечиков и отсутствие жёлтых как бы говорит нам о том, что всех носителей гена жёлтой окраски просто пожрали. Естественный отбор-с.

И да, раз уж я заговорил на эту тему, то бога нет и последователи авраамических религий обломались.

PolarFox ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.