2010-12-07 7 views
1

Я пишу функцию преобразования для единиц измерения в F #. Информация о значениях поступает из веб-приложения ASP.NET.Единица измерения «Тип» в F #

Функция Я создаю определяется следующим образом:

let convert (x:float<_>) (toType : string) = 
    // Do conversion here. 

Первая проблема, я бегу в включает toType: определение строки. Можно ли каким-либо образом определить его, чтобы принять тип float<_> ... особенно из веб-приложения? (Я знаю, что часть CLR на основе Andrew Kennedy's excellent articles, но я не вижу, как обобщенно определить его функции.

Спасибо за любую помощь вы можете предоставить.

+1

Я не понимаю, что вы просите или пытаетесь сделать. – Brian 2010-12-07 19:57:27

+0

@Brian - В принципе, я хочу преобразовать значения, основанные на типе измерения. Основываясь на ответе от @kvb, похоже, что я не могу, поскольку информация удаляется во время выполнения. – JasCav 2010-12-07 20:16:45

ответ

2

Если вы просто хотите, чтобы иметь возможность читать «2,0 фт» и «5,0 м», а затем

  • вы должны написать код, который анализирует строки и делает условной логики (например, если «фут», а затем превращаются в float<ft> или любой другой)

  • когда у вас есть данные, преобразованные в систему # типа F вы можете сделать что-то в типизированного образом

Это типично для каждого приложения, которое хочет получить данные строго типизированного из внешнего мира; есть компонент ввода, который должен анализировать и проверять ввод и хранить его в строго типизированной структуре данных, но тогда программа может использовать эти данные впредь.

(В любой библиотеке нет волшебного анализатора синтаксического анализатора/ввода, вы просто делаете это для своих типов данных.)

2

Я не думаю, что это будет чтобы можно было делать то, что вы хотите, так как типы мер стираются во время выполнения. В частности, нет ничего аналогичного тесту типа времени исполнения (например, оператор F # (:?)) для типов измерений.

Какой тип логики Вы надеялись реализовать внутри своей функции convert?

UP ДАТА

На основании дополнительной информации, предоставленной Вами, вот еще некоторые мысли:

  1. Весь смысл единиц измерения F # 's является обеспечение во время компиляции, что величины используются в подходящие для устройства. Это означает, что вы не можете написать функцию convert : float<'t> -> float<'u> - что произойдет, если ваши пользователи попытаются выполнить бессмысленное преобразование (например, преобразование чего-то с float<kg> в float<m/s^2>)? Работа типов единиц F # заключается в том, чтобы статически запрещать такие преобразования.

  2. Однако, если у вас есть известный список между конвертируемыми типами, вы можете выполнять преобразования, которые приводят к необратим-родового типа возвращаемого значения только с помощью умножения:

    [<Measure>] type m 
    [<Measure>] type km 
    
    
    let convert (f:float) (s:string) : float<m> = 
        match s with 
        | "m" -> f * 1.0<m> 
        | "km" -> f * 1.0<km> * 1000.0<km/m> 
        | _ -> failwith (s |> sprintf "Unknown unit of measure: %s") 
    

    В этом всегда возвращает результат в метрах, основанный на единичной величине и имени единиц, которые он представляет.

+0

У меня есть веб-приложение (научное приложение), которое принимает много введенных пользователем данных. Однако пользователи могут вводить данные в разных единицах в зависимости от того, откуда пришли данные. В результате я должен позволить пользователям иметь возможность конвертировать между единицами, в которых они хотят работать. Я надеялся, что смогу использовать F # или что-то, что уже является частью платформы .NET. К сожалению, библиотеки FOSS обычно не являются опцией. – JasCav 2010-12-07 20:15:35

Смежные вопросы