Создание списка с несколькими единицами измерения поплавков в F#

Итак, я пытался обойти это разными способами, но я просто не могу заставить это работать.

Есть ли способ составить список, содержащий значения различных единиц измерения (все на основе поплавков)? Например:

let myList = [0.07<ms>; 0.9; 7.2<mm>;]

Поскольку они рассматриваются как разные типы, вы не можете поместить их в один и тот же список. Я попытался объявить список как let myList : float<_> list = ... и присвоить безразмерным числам единицу измерения, но все равно получил ошибку ввода: ожидал float‹'u>, но получил float.

Я не могу использовать кортеж/n-ple, так как не знаю количество значений, которые будут в списке.

Я новичок в F # и довольно долго просматривал документы и Интернет в хранилище, но не нашел решения. Если бы кто-нибудь мог указать мне в правильном направлении, я был бы очень признателен. Благодарю вас!


person RachelB    schedule 26.11.2012    source источник
comment
Можете ли вы дать мотивацию для этого? Компилятор заставляет вас делать хорошие вещи.   -  person pad    schedule 26.11.2012
comment
Я хочу использовать список в качестве параметра функции, где значения будут использоваться немного по-разному, в зависимости от того, с каким объектом (созданный из производного класса, все из одного абстрактного класса) вычисляется. Почему это заставляет меня делать добро? Я не понимаю!   -  person RachelB    schedule 26.11.2012
comment
UoM на самом деле изобретен именно по этой причине: чтобы вы не случайно смешали seconds и meters. Функции, которые должны обрабатывать значения, также будут выводить правильные типы аргументов. Пожалуйста, поделитесь кодом использования, чтобы мы выяснили, как вы планируете его использовать.   -  person bytebuster    schedule 26.11.2012


Ответы (2)


Я думаю, вам нужно привести более длинный пример, показывающий, как вы хотите использовать этот список. В противном случае трудно дать хороший ответ, потому что это зависит от использования.

Если вы просто хотите создать список чисел, которые представляют разные вещи, вы можете рассмотреть возможность использования размеченного союза, чтобы различать их:

type Numeric =
  | Length of float<mm>
  | Time of float<ms>
  | Unitless of float

let myList = [ Time 0.07<ms>; Unitless 0.9; Length 7.2<mm>;]

Затем вы можете создать список, содержащий разные числа (с разными физическими значениями). При переборе списка вам нужно будет использовать сопоставление с образцом для извлечения значения.

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

let myList = [ float 0.07<ms>; 0.9; float 7.2<mm>;]

Вы также можете использовать библиотеку F#, которая позволяет отслеживать время выполнения.

person Tomas Petricek    schedule 26.11.2012
comment
Спасибо, это было действительно полезно! Я не могу поверить, что я не подумал о том, чтобы попробовать дискриминационные союзы, это, кажется, хорошо работает для того, что я хочу сделать ... насколько я могу судить на данный момент! Я все еще нахожусь на стадии исследования, поэтому у меня не так много кода, чтобы показать, а то, что у меня есть, не имеет особого смысла на данном этапе, я приношу свои извинения и благодарю вас за попытку помочь в любом случае. :) Также спасибо за ссылку, я смутно читал о некоторых вещах, связанных с этим, и я еще не наткнулся на этот пост. - person RachelB; 26.11.2012

Все члены списка должны иметь один и тот же тип. float<ms> не то же самое, что float<mm>.

person Onorio Catenacci    schedule 26.11.2012