Создание списка с несколькими единицами измерения поплавков в F#
Итак, я пытался обойти это различными способами, но я просто не могу заставить эту работу.
Есть ли способ составить список, содержащий значения различных единиц измерения (все основаны на числах с плавающей запятой)? Например:
let myList = [0.07<ms>; 0.9; 7.2<mm>;]
Поскольку они рассматриваются как разные типы, вы не можете поместить их в один и тот же список. Я попытался объявить список как let myList : float<_> list = ...
и давая безразмерные числа единицу измерения, но я все еще получил ошибку при наборе: ожидал float<'u>, но получил float.
Я не могу использовать tuple/n-ple, так как не знаю, сколько значений будет в списке.
Я довольно новичок в F# и провел довольно много времени, просматривая документы и веб-хранилища, но не нашел решения. Если бы кто-нибудь мог указать мне правильное направление, я был бы очень признателен. Спасибо!
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#, которая позволяет отслеживать единицы во время выполнения.
Все члены списка должны иметь одинаковый тип. float<ms>
это не то же самое, что float<mm>
,