F #: Можно ли динамически связывать единицы измерения во время выполнения? - PullRequest
4 голосов
/ 10 ноября 2010

Я очень новичок в F # и заинтригован функциональностью «Единицы измерения» и имею приблизительное представление о том, как она работает нормально, но хотел бы знать, возможно ли связать меры со значениями, где мы не знаем, чтомера будет продолжаться до тех пор, пока не будет выполнен код?

Практический пример, на который я смотрю, - это привязка чисел с плавающей запятой в виде значений валюты, где единица измерения выводится из поиска в базе данных.что показатели для каждой валюты (доллары США, евро, AUD и т. д.) обычно объявляются:

[<Measure>] USD
[<Measure>] EUR
[<Measure>] AUD
...

Сначала вам понадобится способ получить тип показателя из идентификатора, в идеале само имя показателя в качествеКод валюты, скорее всего, хранится и извлекается в виде 3-символьной строки (аналогично Enum.Parse()).

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

Возможно ли это, или есть другой способ достижения того же результата?

Ответы [ 2 ]

4 голосов
/ 10 ноября 2010

Это невозможно, поскольку единицы измерения F # стираются (они существуют только во время компиляции).

Вы могли бы создать библиотеку с реализацией во время выполнения (я не думал о том, как будет выглядеть дизайн). Но вы, вероятно, потеряли статическую проверку.

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

1 голос
/ 10 ноября 2010

Если вы не пишете код, который на самом деле относится к конкретной валюте, вы не должны явно указывать в своем коде доллары США, евро, австралийские доллары и т. Д.Вместо этого сделайте ваш код полиморфным по отношению к соответствующей валюте / валютам.

Вам нужно подумать о том, какие виды безопасности вы ожидаете получить от единиц измерения.Например, если (в очень упрощенном сценарии) вы читаете из поля базы данных, выполняете некоторую обработку и записываете обратно в это же поле, то иметь функцию типа float<'a> -> float<'a> - это именно то, что вам нужно: вам все равночто такое валюта, если вы вернете ту же валюту, которую вставили.

...