Составные единицы измерения в F# для проверки матричных операций

Одним из серьезных случаев использования единиц измерения являются матричные операции: внутреннее произведение матрицы a*b на c*d допустимо только тогда, когда b = c и т. д....

Однако я не вижу никаких конструкций для «составных единиц», таких как та, которая потребуется.

Есть ли способ проверить это с помощью системы типов в F#?


person nicolas    schedule 30.06.2012    source источник


Ответы (1)


отказ от ответственности: отправлено с телефона => может содержать ошибки

Я бы сказал, что эта проверка каким-то образом может быть достигнута с использованием UoM или фантомных типов. :

[<Measure>] type s
type M<[<Measure>]'w, [<Measure>] 'h>() = 
    static member (*) (a : M<'a, 't>, b : M<'t, 'b>) : M<'a, 'b> = failwith "NYI"
let x = M<s ^ 3, s ^ 3>()
let y = M<s ^ 3, s>()
let z  = x * y // M<s ^ 3, s> 

Однако вопрос: насколько удобно будет пользоваться...

person desco    schedule 30.06.2012
comment
интересный. я бы действительно использовал его, если бы ничего другого внутри не функционировало, так как я думаю, что это может быть бременем. с матричным исчислением я бы сказал, что это похоже на систему типов в F #: если вы правильно указали размерность и общий поток не абсурден, ваша программа верна в 99% случаев. - person nicolas; 01.07.2012
comment
Без способа параметризации с помощью символа, такого как n, вместо статического, такого как 3, он имеет ограниченное применение. с моей точки зрения, использование такой функции было бы огромной победой для научных вычислений. - person nicolas; 01.07.2012
comment
@Desco Я думаю, проблема с UoM в том, что вы не знаете значений во время выполнения, так как же реализовать функцию init():M‹'R,'C› ? Поскольку вы не можете прочитать размеры, пользователь должен указать также в значениях R и C: init(r,c):M‹'R,'C› - person Gus; 02.07.2012