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”
对您来说可以吗?格式不正确,最好是聊天