Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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
F# 是否有更好的方法将数据类型分配给字段?_F# - Fatal编程技术网

F# 是否有更好的方法将数据类型分配给字段?

F# 是否有更好的方法将数据类型分配给字段?,f#,F#,我有一个声明如下的变量: type Variable = { name : string id : int datatype : Object } match variable.datatype with | :? System.Byte -> printf "Byte" | :? System.Double -> printf "Double" | _ -> printf -> "Other type" 稍后,我想做这样的事情: type V

我有一个声明如下的变量:

type Variable = {
    name : string
    id : int
    datatype : Object
}
match variable.datatype with
| :? System.Byte -> printf "Byte"
| :? System.Double -> printf "Double"
| _ -> printf -> "Other type"
稍后,我想做这样的事情:

type Variable = {
    name : string
    id : int
    datatype : Object
}
match variable.datatype with
| :? System.Byte -> printf "Byte"
| :? System.Double -> printf "Double"
| _ -> printf -> "Other type"
我最初的尝试是像这样声明
变量
(A):

let variable={name=“foo”;id=0;datatype=System.Byte}

但是,这会导致
数据类型
包含类似于
的内容,并且
匹配
的行为不符合要求-它总是碰到“其他”情况

我找到了一个解决办法,即
let variable={name=“foo”;id=0;datatype=Unchecked.defaultof}
。然而,这并没有清楚地表达意图

如何改进
变量
的声明,使
数据类型
包含
类型
,以便(a)中的声明有效


我正在学习F#和.NET,这里没有生产代码或作业。因此,除了在基本值类型和可能的
string
上具有所需的
匹配
行为之外,没有任何约束。很明显,我缺少了一些可以很容易解决这个问题的基本知识(与语言功能相关的词汇表等),但我遇到了一个障碍,试图弄清楚这可能是什么。

一个解决方案是为
数据类型创建一个简单的包装器类型:

type DataType =
| Byte
| Char
| Int
| Double
| String
(旁白:以这种方式重用语言关键字看起来很奇怪。)

变量
的声明随后变为:

type Variable = {
    name : string
    id : int
    datatype : DataType
}
以我们想要的方式声明变量:
let variable={name=“foo”;id=0;datatype=Byte}

然后以这种方式编写
match
语句执行以下操作:

match variable.datatype with
| Byte -> printf "Byte"
| Double -> printf "Double"
| _ -> printf "Other type"

一种解决方案是为
数据类型
创建一个简单的包装器类型:

type DataType =
| Byte
| Char
| Int
| Double
| String
(旁白:以这种方式重用语言关键字看起来很奇怪。)

变量
的声明随后变为:

type Variable = {
    name : string
    id : int
    datatype : DataType
}
以我们想要的方式声明变量:
let variable={name=“foo”;id=0;datatype=Byte}

然后以这种方式编写
match
语句执行以下操作:

match variable.datatype with
| Byte -> printf "Byte"
| Double -> printf "Double"
| _ -> printf "Other type"

我想我有一半的答案。如前所述,我们可以使用System.Type而不是System.Object

type Variable = {
    name : string
    id : int
    datatype : System.Type
}

let variable = { name = "foo"; id = 0; datatype = typeof<System.Byte> }

let (|IsType|_|) (vartype: System.Type) (variable: Variable) =
    if variable.datatype = vartype then Some () else None

let ByteType = typeof<System.Byte> // why do I need these let-bindings
let DoubleType = typeof<System.Double> // ahead of the match construct ?

match variable with
| IsType ByteType -> printf "Byte"
| IsType DoubleType -> printf "Double"
| _ -> printf "Other type"
类型变量={
名称:string
id:int
数据类型:System.Type
}
让变量={name=“foo”;id=0;datatype=typeof}
let(| IsType | | |)(vartype:System.Type)(变量:variable)=
如果variable.datatype=vartype,则有些()其他()无
let ByteType=typeof//为什么我需要这些let绑定
让DoubleType=typeof//在匹配构造之前?
匹配变量
|IsType ByteType->printf“字节”
|IsType DoubleType->printf“Double”
|->printf“其他类型”

编辑:我仍然不确定如何编写模式匹配。特别是,我不明白为什么不允许我将
typeof
直接放在代码的匹配部分。

我想我有一半的答案。如前所述,我们可以使用System.Type而不是System.Object

type Variable = {
    name : string
    id : int
    datatype : System.Type
}

let variable = { name = "foo"; id = 0; datatype = typeof<System.Byte> }

let (|IsType|_|) (vartype: System.Type) (variable: Variable) =
    if variable.datatype = vartype then Some () else None

let ByteType = typeof<System.Byte> // why do I need these let-bindings
let DoubleType = typeof<System.Double> // ahead of the match construct ?

match variable with
| IsType ByteType -> printf "Byte"
| IsType DoubleType -> printf "Double"
| _ -> printf "Other type"
类型变量={
名称:string
id:int
数据类型:System.Type
}
让变量={name=“foo”;id=0;datatype=typeof}
let(| IsType | | |)(vartype:System.Type)(变量:variable)=
如果variable.datatype=vartype,则有些()其他()无
let ByteType=typeof//为什么我需要这些let绑定
让DoubleType=typeof//在匹配构造之前?
匹配变量
|IsType ByteType->printf“字节”
|IsType DoubleType->printf“Double”
|->printf“其他类型”

编辑:我仍然不确定如何编写模式匹配。特别是,我不明白为什么不允许我将
typeof
直接放在代码的匹配部分。

使用
System.Type
,而不是
System.Object
简而言之,你不能,类型属于字段,字段的内容必须包含一个特定类型的值。然而,从这个问题来看,您可以只分配一个字符串,即
System.Byte
。您所做的基本上是为
Systyem.Byte
分配
null
值,而
未选中.defaultof
。它基本上是类型的空值。所以也许这就是你想要的。@FyodorSoikin我也试过了。(A)中的声明随后导致错误
。此函数接受太多参数,或用于不需要函数的上下文中。我遗漏了什么?如果您将
print
函数更改为:
让print variable=match variable.datatype与| x=typeof->printfn“Byte”| x=typeof->printfn“Double”|->printfn“Other type”
是否适合您?格式错误,真正更好的聊天方式是使用
System.Type
,而不是
System.Object
简而言之,您不能,类型属于字段,字段的内容必须包含一个特定类型的值。然而,从这个问题来看,您可以只分配一个字符串,即
System.Byte
。您所做的基本上是为
Systyem.Byte
分配
null
值,而
未选中.defaultof
。它基本上是类型的空值。所以也许这就是你想要的。@FyodorSoikin我也试过了。(A)中的声明随后导致错误
。此函数接受太多参数,或用于不需要函数的上下文中。我遗漏了什么?如果您将
print
函数更改为:
让print variable=match variable.datatype与| x=typeof->printfn“Byte”| x=typeof->printfn“Double”|->printfn“Other type”
对您来说可以吗?格式不正确,最好是聊天