LINUX.ORG.RU

Как начинать изучать функциональное программирование?

 


1

5

Что то захотелось поучить Haskell или чего еще в этом духе, но что взять в качестве учебного материала? в 2018 то.

haskell если возьму то станет первым моим ЯП. До этого лишь максимум калькуляторы на плюсах и шарпах и простейшие конструкции на Паскале. Стоит ли вообще или лучше к нему прийти после года на других ЯП (к примеру) Ruby, C, или Python?

Деньги нужны будут только через 2 года(мне 16) так что думаю пока могу глянуть на языки. (или стоит набивать двухлетний опыт на одном лишь питоне?)



Последнее исправление: StepanKirdin (всего исправлений: 2)
Ответ на: комментарий от monk

На Haskell можно писать один-в-один как на любом другом языке

Как насчет вызвать функцию с side-effects из чистой функции? На большинстве прочих языков проблемы нет.

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

Как насчет вызвать функцию с side-effects из чистой функции?

Хочешь сайд-эффекты в чистой функции? А ты тонкий ценитель функцианальщины (не путать с ФП).

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

Как насчет вызвать функцию с side-effects из чистой функции? На большинстве прочих языков проблемы нет.

Продемонстрируй side-effects из чистой функции на любом языке.

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

Продемонстрируй side-effects из чистой функции на любом языке.

#include <syslog.h>

static int compare(int a, int b)
{
  int result = a < b ? -1 : a > b ? 1 : 0;
  syslog(LOG_INFO, "compare (%d, %d) => %d", a, b, result);
  return result;
}

static int wrapper(const void *a, const void *b)
{
  return compare(*(int*)a, *(int*)b);
}

int main()
{
  int data[] = {3, 2, 5, 1, 9, 0};
  openlog("foo", LOG_PERROR | LOG_NODELAY);
  qsort(data, sizeof(data) / sizeof(*data), sizeof(*data), wrapper);
  return 0;
}

Problems? Монадой-то в сигнатурке отсвечивать не надо.

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

А зачем тебе тогда чистая функция?

А потому что глубоко в дерях библиотечной функции тебе внезапно понадобилось произвести сайд-эффект. И не мне тебе рассказывать, что в таком чистом и академичном хаскелле как раз для целей «отладки printf-ами» поставляется костыль.

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

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

А где тут чистая? Это пишется так:

compare a b = do
  let result = if a < b then -1 else if a > b then 1 else 0
  syslog logInfo "compare (%d, %d) => %d" a b result
  return result

main = do
  data <- newListArray (0,5) [3, 2, 5, 1, 9, 0]
  openlog "foo" [logPerror, logNodelay]
  qsort data compare

А чистая в стандартном Си не существует, а в gcc помечается __attribute__((pure)).

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

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

Если тебе в gcc в помеченной __attribute__((pure)) захочется сделать сайд-эффект, то проблем будет не меньше.

А в Haskell для особых извратов есть unsafePerformIO.

как раз для целей «отладки printf-ами» поставляется костыль

Отладка - особый случай. К тому же пользоваться этим костылём не обязательно.

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

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

В С++ из базовых типов только число и указатель. Так из-за этого переливать между std::string, QString, CString, vtkString и char* приходится довольно часто. В Haskell в этом смысле проще.

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от monk

В С++ из базовых типов только число и указатель.

А я не о C++ речь веду.

Это пишется так

Было бы интересно увидеть тип compare. Это ведь будет не Int -> Int -> Int?

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

Было бы интересно увидеть тип compare. Это ведь будет не Int -> Int -> Int?

compare :: (Monad m, Num a, Ord p) => p -> p -> m a

Можно упростить до Int -> Int -> IO Int как в Си.

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

в Haskell, есть Debug.Trace.trace, Debug.Trace.traceM и даже дамп в event-log, если очень хочется.

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

лучше все же Ordering возвращать, если не хочется совсем уж играть в си и возращать разницу между символами. (не так эффективно, но все же)

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

Да. Скажем, логгирования в syslog хочу. Проблемс?

Возвращай тапл/структуру/whatever содержащее результат и событие в логи. Приводи к композиции клейсли, выполняй цепочку операций, по результатам забирай результаты и логи.

Логи сохраняешь отдельно.

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

Возвращай тапл/структуру/whatever содержащее результат и событие в логи

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

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

Мой вариант легче тестировать.

Но беда в том, что пока ты дойдешь до женщин - от туда уже выйдут питонист и похапешник.

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