| |||
![]()
|
![]() ![]() |
![]()
Про фигню К этому вот обсуждению. Немножко подумав: кажется, противоречивость синтаксиса тут кажущаяся: то есть его можно с очень небольшими натяжками засунуть в достаточно привычную программистскую семантику, в 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 -> (f (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. Так что ничего особенно противоречивого нет, а вообще - это фигня все, конечно. |
||||||||||||||
![]() |
![]() |