Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “计量单位”;“类型”;在F#_C#_F# - Fatal编程技术网

C# “计量单位”;“类型”;在F#

C# “计量单位”;“类型”;在F#,c#,f#,C#,F#,我正在为F#中的测量单位编写一个转换函数。有关值的信息来自ASP.NET web应用程序 我正在创建的函数定义如下: let convert (x:float<_>) (toType : string) = // Do conversion here. let convert(x:float)(toType:string)= //在这里做转换。 我遇到的第一个问题涉及toType:string定义。有没有办法让define接受float类型…特别是来自web应用程序的类型?(

我正在为F#中的测量单位编写一个转换函数。有关值的信息来自ASP.NET web应用程序

我正在创建的函数定义如下:

let convert (x:float<_>) (toType : string) =
  // Do conversion here.
let convert(x:float)(toType:string)=
//在这里做转换。
我遇到的第一个问题涉及toType:string定义。有没有办法让define接受
float
类型…特别是来自web应用程序的类型?(我知道它是基于的CLR的一部分,但我不知道如何在函数中一般地定义它


感谢您提供的任何帮助。

我认为您不可能随心所欲,因为度量值类型在运行时会被擦除。特别是,对于度量值类型,没有类似于运行时类型测试(例如F#s(:?)操作符)的东西

您希望在
convert
函数中实现什么类型的逻辑

更新

根据您提供的其他信息,以下是一些想法:

  • F#的度量单位的全部要点是在编译时强制要求以适合单位的方式使用数量。这意味着您无法编写函数
    convert:float
    ——如果您的用户尝试执行无意义的转换,会发生什么(比如从
    float
    转换为
    float
    )?F#的单位类型的工作就是静态地防止这样的转换

  • 但是如果您有一个已知的可转换类型列表,您可以通过使用乘法执行转换,从而生成非单位通用返回类型:

    [<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")
    
    []类型m
    []类型km
    让我们转换(f:float)(s:string):float=
    匹配
    |“m”->f*1.0
    |“公里”->f*1.0*1000.0
    ||->failwith(s |>sprintf“未知度量单位:%s”)
    
    这总是基于无单位数量及其表示的单位名称返回以米为单位的结果


  • 我认为不可能做你想做的事情,因为度量值类型在运行时会被擦除。特别是,对于度量值类型,没有什么类似于运行时类型测试(比如F#s(:?)操作符)

    您希望在
    convert
    函数中实现什么类型的逻辑

    更新

    根据您提供的其他信息,以下是一些想法:

  • F#的度量单位的全部要点是在编译时强制要求以适合单位的方式使用数量。这意味着您无法编写函数
    convert:float
    ——如果您的用户尝试执行无意义的转换,会发生什么(比如从
    float
    转换为
    float
    )?F#的单位类型的工作就是静态地防止这样的转换

  • 但是如果您有一个已知的可转换类型列表,您可以通过使用乘法执行转换,从而生成非单位通用返回类型:

    [<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")
    
    []类型m
    []类型km
    让我们转换(f:float)(s:string):float=
    匹配
    |“m”->f*1.0
    |“公里”->f*1.0*1000.0
    ||->failwith(s |>sprintf“未知度量单位:%s”)
    
    这总是基于无单位数量及其表示的单位名称返回以米为单位的结果


  • 如果你只想读“2.0英尺”和“5.0米”,那么

    • 您应该编写解析字符串并执行某些条件逻辑的代码(例如,如果“ft”,则变成
      float
      或其他任何形式)

    • 一旦你将数据转换成F#type系统,你就可以用一种类型安全的方式进行操作

    这是每个希望从外部世界获取强类型数据的应用程序的典型特征;有一个输入组件必须解析和验证输入,并将其存储到强类型数据结构中,但此后程序可以使用该数据


    (在任何库中都没有神奇的解析器/输入验证器,您只需为您的数据类型执行即可。)

    如果您只想能够在“2.0英尺”和“5.0米”范围内读取数据,那么

    • 您应该编写解析字符串并执行某些条件逻辑的代码(例如,如果“ft”,则变成
      float
      或其他任何形式)

    • 一旦你将数据转换成F#type系统,你就可以用一种类型安全的方式进行操作

    这是每个希望从外部世界获取强类型数据的应用程序的典型特征;有一个输入组件必须解析和验证输入,并将其存储到强类型数据结构中,但此后程序可以使用该数据


    (任何库中都没有神奇的解析器/输入验证器,您只需针对您的数据类型进行操作即可。)

    我不明白你在问什么或试图做什么。@Brian-基本上,我想根据测量类型转换值。根据@kvb的回答,似乎我无法转换,因为信息在运行时被删除。我不明白你在问什么或试图做什么。@Brian-基本上,我想根据测量类型转换值测量类型。根据@kvb的回答,由于信息在运行时被删除,我可能无法进行测量。我有一个web应用程序(科学应用程序)这会接收大量用户输入的数据。但是,用户可能会根据数据的来源以不同的单位输入数据。因此,我必须允许用户能够在他们想要使用的单位之间进行转换。我希望我可以利用F#,或者已经是.NET framework一部分的东西。FOSS库不是通用的不幸的是,通常是一个选项。好吧,
    convert:float
    肯定有意义。上面的例子,将英尺转换为米,是一个主要候选:
    let footToMeter(x:float)=x*0。