LINUX.ORG.RU

imperative->functional

 


0

3

Посоветуйте книгу/ресурс, где будут переводы нетривиальных приложений (серверов например) с императивного в функциональный стиль. Лучше в рамках одного языка.

Спасибо

Перемещено mono из talks

★★★☆☆

В императивном стиле и на чистейшем хаскеле пишут (например, об IO говорят иногда как об императивной монаде). Императивность заключается в упоре на последовательность действий. Полагаю, что в нетривиальных приложениях реального мира от императивности никуда не деться. И не важно, что оно может быть записано через чистые функции, возвращающие побочные грязные эффекты.

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

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

«ФЯП в реальной жизни использую извращенцы, выражая моделируя императивную логику через функциональную модель, которая в любом васике доступна без всяких свистобубноплясок»... зопейсал, спасибо

anonymous ()

Нет особого смысла переводить такие приложения полностью на ФП.

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

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

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

Монады в хаскеле — наперсточничество. Вроде понимаешь, что тебя обманывают, но не понимаешь, где именно.

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

Смотри в сторону Erlang, там, по идее, должно найтись то, что ты хочешь. А Haskell - это на поиграться.

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

Никому не нужно вас убеждать, к сожалению. Пишите на императивных языках.

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

На Эрланге тоже можно писать код императивно:

...
Result = catch mymodule:myfunction(MyParameters),
case Result of
  {'EXIT', Reason} -> io:format("An exception occured: ~p~n", [Reason]);
  {error,  Reason} -> io:format("An error occured: ~p~n", [Reason]);
  _ -> dont_complain
end,
io:format("Result = ~p~n", [Result]),
...
Чистая функциональщина не всегда одинаково полезна/эффективна.

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

Это фигня, основная разница в мутабельности, а такие мелочи они не особо влияют.

Norgat ★★★★★ ()

/* любопытство замучило */
Если не секрет, а зачем тебе это?
Есть какие-то практические цели/задачи?
Или просто академический интерес?
Я, например, такого ещё не встречал.

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

Ядреная императивщина, которую реализовали через монады

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

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

... но то же самое можно написать и почти функционально:

...
io:format("Result = ~p~n", [
  case catch ( mymodule:myfunction(MyParameters) ) of
    R = {'EXIT', Reason} -> io:format("An exception occured: ~p~n", [Reason]), R;
    R = {error,  Reason} -> io:format("An error occured: ~p~n", [Reason]), R;
    R -> R
  end
]),
...
Почти, потому что и в этом варианте возвраты R следуют за io:format-ами, что можно назвать императивщиной.

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

Ядреная императивщина, которую реализовали через монады,

Есть ещё такой известный момент, что многие путают монады вообще с монадой IO, и думают, что если написано do - значит, там императивность.

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

Я потому и спрашиваю, есть ли такие примеры кода, где можно посмотреть мифический красивый функциональный код

В питоне (простите) сплошь и рядом какие то куски проще писать в ФП стиле. Самый простой пример, есть файл с числами в неск столбцов, его нужно прочитать как список списков:

R = []
for l in open('file.dat') :
    L = []
    for x in l.split() : L.append(float(x))
    R.append(L)    

или

R = [ map( float, l.split() ) for l in open('file.dat') ] 

А так, гоняться за ФП только потому что оно ФП...

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

А почему with не используешь?

with open('filename') as f:
    R = [map(float, line.split()) for line in f.readlines()]
anonymous ()
Ответ на: комментарий от anonymous

А нафига козе боян? Он и так закроется... кроме того, readlines() читает сразу все, а open создает итерируемый объект - с т.з. исп памяти второй предпочтительней.

AIv ★★★★★ ()

Меня тоже интересовал как раз похожий вопрос. Типа книги «C -> Java», но описывающей как императивные идиомы выглядят в функциональном виде. Ведь просто читая книгу, продолжаешь думать в императивном стиле и эффект не тот.

Из реального практического применения мне видятся только олимпиадные задачи по информатике. Насколько я понимаю, используя ФП, можно наконец-то сосредоточиться только на решении задачи, т.к. оно довольно лаконично может быть записано на ФП. Вместо выдумывания структур данных, циклов их обхода, отладки(!) и т.п.

В разброс такие задачки с кодом находятся, но ресурса с систематическим подходом я пока не нашёл.

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