LINUX.ORG.RU

Вопрос по чистоте ф-ций

 , ,


0

1

Вот такой кодец, допустим.


Account := Object clone do(
 balance ::= 0
 deposit := method(amount, setBalance(balance + amount))
)

account := Account clone

deposit := method(amount, account, account deposit(amount); account)

deposit(10, account) print
deposit(30, account) print

# :::  Account_0xbb0a18:
# :::   balance          = 10
# :::  Account_0xbb0a18:
# :::   balance          = 40
Функция депозит всегда возвращает одно и то же — экземпляр аккаунта (который подается в качестве аргумента).

Но если бы она, даже, допустим, возвращала не сам экземпляр, а баланс экземпляра, она все равно возвращала бы одно и то же — баланс экземпляра, который подан в качестве аргумента.

То есть, с математической точки зрения, пракчески любая ф-ция чиста, и референциально-прозрачна.

Однако, поклонники ФП утверждают, что это не так. В таком случае, у них некая своя трактовка. Вот, собственно, в этом и вопрос. Хотелось бы услышать эту трактовку, в четкой и ясной форме.

Спасибо.



Последнее исправление: clean_dude (всего исправлений: 1)

Ответ на: комментарий от Sectoid

Именно так. Поэтому я и уточнил, что это не всегда так (%.

grouzen ★★
()

Но если бы она, даже, допустим, возвращала не сам экземпляр, а баланс экземпляра, она все равно возвращала бы одно и то же — баланс экземпляра, который подан в качестве аргумента.

Вот у тебя есть функция, которая принимает два «баланса экземпляра» и проверяет их на структурное равенство. Если она чистая (а как ты говоришь все ф-и чистые) то получив два «баланса экземпляра» она должна всегда для этой пары аргументов всегда возвращать одно и то же значение. Но этот инвариант не выполянется.

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

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

А теперь сдрисни отсюда, шизофреник.

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

Повторяю для тупых: новоесостояние = чистаяфункция(староесостояние).

Пост не читай/сразу отвечай

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

mkStdGen :: Int -> StdGen

Генератор из Инта это как-то маловато. Попробуй так Float -> String -> [String] -> [Char] -> Integer -> Int -> StdGen. Может так генератор получится почище.

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

лол. функция, возвращающая рандом, грязная?

Конечно. Лол.

no-such-file ★★★★★
()
Ответ на: комментарий от anonymous

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

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

Вообще-то я в том посте объяснил, почему ТС не может прав.

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