Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет kouzdra ([info]kouzdra)
@ 2010-06-20 07:55:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Про фигню
К этому вот обсуждению.

Немножко подумав: кажется, противоречивость синтаксиса тут кажущаяся: то есть его можно с очень небольшими натяжками засунуть в достаточно привычную программистскую семантику, в O'Caml например:

что соответствует f(x,y) = ...: что-то вроде f = fun {x=x; y=y} → ..., где x, y - имена аргументов (по техническим соображениям тут удобнее n параметров собирать в структуру, нежели пользоваться традиционным способом представления функции от нескольких аргументов, как функции, возвращающей функцию).

что такое f (x,y), как ссылка на функцию: вероятно f с явной спецификацией типа: f : {x:float; y:float} → float или, если не хочется явно специфицировать область значений аргументов и результата: f : {x: 'a; y:'b} → 'c: разница скорее синтаксическая - смысл тот же - "f зависит от двух параметров с именами x и y".

Теперь df/dx: это переходит в что-то типа d (f, #x) то есть производная f по параметру с именем x - реально так писать нельзя, потому что в O'Caml имена полей не могут быть вычисляемыми значениями, но это деталь скорее техническая: разрешить это труда не составит (просто никому не нужно), равно как и выразить это чуть более громоздко:

d (f, #x) d (f, (fun {x=x; y=_} -> x), (fun new_x {x=_; y=y} -> {x=new_x; y=y})

И навернуть вокруг этого для "красоты" соответствующий макрос.

PS: Это даже можно запрограммировать:

type one_arg = {x:float}
let dx = 0.0001
let d f get_x set_x = fun arg -> ((set_x (get_x arg +. dx) arg) -. f arg) /. dx
let sqr {x=x} = x *. x

и оно даже работает:
let _ = Printf.printf "%f\n"               (d sqr (fun {x=x} -> x) (fun x _ -> {x=x}) {x=2.0})

действительно выводит примерно 4. Так что ничего особенно противоречивого нет, а вообще - это фигня все, конечно.


(Добавить комментарий)


[info]lqp
2010-06-20 09:32 (ссылка)
Прикол там в непонимании того, чем отличается переменная в математике от переменной в программизме.

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

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

(Ответить) (Ветвь дискуссии)


[info]kouzdra
2010-06-20 14:01 (ссылка)
Строго говоря, переменная в функциональных языках от математической переменной отличается не очень сильно. А закавыка тут imho в другом: функция к своему значению относится примерно также, как указатель к тому, на что он указывает (и вообще - имя к означаемому) - а это тема, в которой путаются постоянно.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]lqp
2010-06-20 19:58 (ссылка)
Сильно отличается, сильно. Математическую переменную в дискретно-цифровом компьютере не представишь, как ни меняй нотацию. Конечно, что-то можно приблизить, а что-то сымитировать, но в конечном счете природу не обманешь.

В программировании переменная всегда имеет конкретное значение в данный момент времени. Возможно заранее неизвестное, но конкретное и одно.

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

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]kouzdra
2010-06-20 20:02 (ссылка)
Математическую переменную в дискретно-цифровом компьютере не представишь, как ни меняй нотацию. Конечно, что-то можно приблизить, а что-то сымитировать, но в конечном счете природу не обманешь

Вообще-то есть версии матана, где множество вещественных чисел конечно.

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

В функциональных языках нет времени. И именно - все случается одновременно.

(Ответить) (Уровень выше)


[info]kaledin
2010-06-22 00:47 (ссылка)
>"f зависит от двух параметров с именами x и y"

Vo-vo -- ehto chisto programmistskij sposob dumat'.

V matematike, funkciya ehto otobrazhenie iz odnogo mnozhestva v drugoe. "Parametry", ili zhe "peremennye" -- ehto prosto funkcii na tom zhe mnozhestve so znacheniyami v R. Sootvestvenno, \6 f/\6 x nekorrektno -- esli zadat' funkciyu f i eshche druguyu funkciyu x, pust' dazhe nevyrozhdennuyu, t.e. yavlyayushcuyusya chast'yu polnoj sistemy koordinat -- vse ravno nikakogo smysla chastnaya proizvodnaya ne imeet. Potomu chto ona zavisit ne tol'ko ot x, no i ot vsej sistemy koordinat.

T.e. ehto oboznachenie ochen' arhaicheskoe, iz tekh vremen, kogda lyudi ne osoznavali, chto byvayut mnozhestva bez yavno vybrannoj i zafiksirovannoj sistemy koordinat.

(Ответить)