LINUX.ORG.RU
ФорумTalks

[вещества]императивщина vs функциональщина

 


0

0

императивный программист, что-бы сделать бутерброд, пишет что сделать:

int сделать_бутерброд()
{
        Хлеб * хлб = ОтрезатьХлеб();
        Сыр  *сыр = ОтрезатьСыр();
        Колбаса *клб = ОтрезатьКолбасу();

        return PutOnTop(хлб, клб);
}


фнуциональный программист, когда хочет бутерброд, пишет:

хочу бутерброд 
          where бутерброд = хлеб ++ сыр ++ колбаса


императивщина рулит

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

>А, да, я про него что-то в конце вспомнил, и забыл вписать код добавления сыра :)

теперь понял что рулит?

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

> А, да, я про него что-то в конце вспомнил, и забыл вписать код добавления сыра :)

Это провокация, направленная на очернение иперативщиков.

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

Для меня это и так было очевидно :)

fmj
() автор топика
Ответ на: комментарий от true

У меня компиляция обломалась на шаге 

#include <Еда.h> 
и 
#include <Холодильник.h>

 так что до варнингов дело не дошло ;)

fmj
() автор топика

У тебя утечка памяти в сыре :) Вывод: императивщик берет и делает бутерброд, хоть и без сыра, а функциональщик продолжает "хотеть" свой бутерброд дальше

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

> У тебя утечка памяти в сыре :) Вывод: императивщик берет и делает бутерброд, хоть и без сыра, а функциональщик продолжает "хотеть" свой бутерброд дальше

функциональщику наоборот проще, ему нужно просто описать, что он хочет, и умный ФП сам все сделает, да еще и распаралелит задачу на несколько свободных рук/ножей :)

fmj
() автор топика

хм... для того, чтобы намазать это дело еще и маслом, у функциональщика надо просто добавить « ++ масло», а императивщикам еще править и править :)))

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

> хм... для того, чтобы намазать это дело еще и маслом, у функциональщика надо просто добавить « ++ масло»

И надеяться на то, что оно будет намазано с одной стороны, и именно с такой, с какой нужно :-)

r_asian ★☆☆
()

<?(глобально и надежно версии 6.0)

Сыр = "кусок сыра"
Кайбасу = "большой кусок колбасы"
Хлеб = "ароматный домашний кусок хлеба"

Сделать_мне_хорошо = "На {$Хлеб} я кладу {$Cыр} и сверху {$Кайбасу}"
?>

phasma ★☆
()

PutOnTop(хлб, клб); видимо возвращает номер ошибки, в случае неудачного накладывания переменных переданных в качестве параметров ? :) В данном примере императивный программист ни есть ничего. Просто осознает результат операции :)

robot12 ★★★★★
()

Какой-то неправильный пример.

int сделать_бутерброд() { return PutOnTop(Хлеб(), Сыр(), Колбаса()); }

Та же самая фигня, что и бутерброд = хлеб ++ сыр ++ колбаса, только по другому записано.

bizanine
()

некорректные примеры. тогда уж для фп:

(define сделать_бутерброд 
    (lambda (хлеб, сыр, колбаса)
        (отрезать хлеб)
        (отрезать сыр) 
        (отрезать колбаса)
        (+ хлеб сыр колбаса))) 

kranky ★★★★★
()

бутерброд = бутер + брод.

Масло и хлеб.

Без сыра и колбасы.

ip1981 ☆☆
()

#include <stf> # Standard Template Food

stdfood::бутерброд сделатьБутерброд()
{
    using namespace stdfood;
    return бутерброд() << хлеб() << сыр() << колбаса();
}

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

> return бутерброд() << хлеб() << сыр() << колбаса();

Как говорят бывалые, функция состоящая из одного ретурна, даже если это и C++ функция, уже написана в ФП стиле ;)

fmj
() автор топика
Ответ на: комментарий от kranky

> некорректные примеры. тогда уж для фп:

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

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

И как же по твоему компилятор догадается, что

хлеб ++ сыр ++ колбаса

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

Функция хлеб возвращает целую буханку, а нам нужен ломтик, значит нужна функция, которая на основе функции "хлеб" вернет функцию "ломтик хлеба". Тоже самое с сыром и колбасой.

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

> И как же по твоему компилятор догадается, что
хлеб ++ сыр ++ колбаса

> И как же по твоему компилятор догадается, что
хлеб ++ сыр ++ колбаса

> это связанно с нарезанием на ломтики. А не просто порубить все в фарш и смешать. Или не оставить не нарезанными и вернуть целую буханку, целую палку колбасы и целую головку сыра?

Хорошо, тогда так (на самом деле вместо ++ нужно использовать :, т.е. ++ это оператор конкатенации списков, я еще поменял порядок, т.к. все-же сначала кладется хлеб, а потом сверху сыр и колбаса):

хочу бутерброд 
           where бутерброд = ломтикКолбасы : ломтикСыра : [ломтикХлеба]
                      where takeЛомтик (v:vs) = v
                                ломтикХлеба = takeЛомтик хлеб
                                ломтикСыра  = takeЛомтик сыр
                                ломтикКолбасы  = takeЛомтик колбаса

fmj
() автор топика

не хватает монады "Съесть".

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

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

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

> Никаких "отрезать" недопускается, это деструктивные операции, к тому-же явно указывающие, что нужно делать. Для чистого ФП нужно описать сам бутерброд, а компилятор сам должен его скомпилить :))

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

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

относитесь к хлеб/колбаса/сыр как к бесконечным спискам вроде:

сыр = "СЫР" : сыр

Где вметос "СЫР" - хранится настоящий сыр :)

На а если вас такое определние не устроит, ну да дално, держите: 

хочу бутерброд продукты
         wehere бутерброд  = foldr (\i p->(head i):p ) []

где продукты - это список продуктов, из которых готовится бутерброд ;)
Сам код функционально чистый, а получить список продуктов -- 
оборачивайте в монаду :)

fmj
() автор топика
Ответ на: комментарий от gdv2

> а это сразу нарушает функциональную "чистоту" алгоритма

компьютер вполне определяется тройкой: 1) последовательность внутренних состояний (память) 2) внешние источники воздействия 3) программа (понимаются все процессы в ЭВМ)

время в компьютере дискретно, т.е. имеем последовательность [0, 1 ...].

нас ничего не интересует, кроме состояний ЭВМ, (в т.ч. и сама ЭВМ), поэтому считаем, что компьютер есть последовательность его состояний. И вот, определение:

<получить состояние>(<программа>,<внешние воздействия>,<предыдущее состояние>) = программа(<предыдущее состояние>,<внешние воздействия>)

вполне себе функционально

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

> вполне себе функционально

Аналогичным (вернее прямо-противоположиным написанному) образом и из функционального языка, не нарушая функциональности, можно императивщину получить :)

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

Теперь заливайте все на sf.net , это будет достойно смотрется рядом с libastral.sf.net.

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

push хлеб
push сыр
push колбаса
add //прибавляет верхний элемент к нижнему 
add
pop //сожрать

fixed?

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

багфикс
не толкается 1 байт в стек, факаный x86 !

push ax //заталкивает 2 байта в стек
push bx //аналогично
push ebx //снимает из стека 4 байта


>push хлеб
>push сыр
>push колбаса
>add //прибавляет верхний элемент к нижнему
>add
>pop //сожрать

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

matich
()

(жена #'(готовить 'бутреброд :из '(сыр колбаса хлеб)))

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

> хлеб ++ сыр ++ колбаса

Кстати функциональщик сделал бутерброд в соответствии с заветами одноименного кота. Хлеб идет первым, потом сыр, потом колбаса

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

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

Ага, у него в мозгу стековая машина

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