F# 联合类型中的单事例联合类型
我有以下联合类型:F# 联合类型中的单事例联合类型,f#,F#,我有以下联合类型: type UserName = UserName of string type LogLineType = | UserName of UserName | EmptyLine 以及一个返回LogLineType的函数: let getLogLineType line = let userName = UserName "foo" userName 然而,我不断得到一个编译错误,说 该表达式应具有UserName类型,但具有string类型 我知道它试图
type UserName = UserName of string
type LogLineType =
| UserName of UserName
| EmptyLine
以及一个返回LogLineType
的函数:
let getLogLineType line =
let userName = UserName "foo"
userName
然而,我不断得到一个编译错误,说
该表达式应具有UserName类型,但具有string类型
我知道它试图从
用户名
类型构造对数线型
,但我如何告诉编译器我试图从字符串
(单例联合)构造用户名
?您可以使用UserName.UserName“foo”
解决这个问题:
但是正如@ildjarn在他的评论中所说的,必须用相同的名称来联合案例可能是不明智的。您可以使用
UserName.UserName“foo”来解决这个问题。
:
但是正如@ildjarn在他的评论中所说的那样,必须用相同的名称合并案例可能是不明智的。不清楚您希望
getLogLineType
函数返回哪个UserName
函数,但函数的名称暗示了后者(即LogLineType
的案例)
在这种情况下,首先需要将字符串转换为第一个用户名
大小写,然后将该值转换为第二个用户名
大小写。为了做到这一点,您需要消除一些歧义:
let getLogLineType line =
let userName = UserName (UserName.UserName "foo")
userName
此函数的类型为'a->LogLineType
然而,正如@ildjarn在评论中所说的,拥有两个同名的联合用例是自找麻烦的。不清楚希望
getLogLineType
函数返回哪个UserName
,但函数名暗示了后者(即LogLineType
的用例)
在这种情况下,首先需要将字符串转换为第一个用户名
大小写,然后将该值转换为第二个用户名
大小写。为了做到这一点,您需要消除一些歧义:
let getLogLineType line =
let userName = UserName (UserName.UserName "foo")
userName
此函数的类型为'a->LogLineType
然而,正如@ildjarn在评论中所说,拥有两个同名的联合案例是自找麻烦。两个同名的联合案例是自找麻烦。两个同名的联合案例是自找麻烦。可能预期编译器仍然会根据用法推断出正确的类型,但事实并非如此。如果存在这样的歧义(或类似于具有相同名称字段的记录类型),编译器将使用最后定义的类型(如果没有进一步限定),该函数的类型为
'a->UserName
。从OP中不清楚这是否是所需的类型,但从LogLineType
DU的名称和存在来看,我想不是。请参阅我的答案以获得替代方案。可能预期编译器仍然会根据使用情况推断正确的类型,但事实并非如此。如果存在这样的歧义(或类似于具有相同名称字段的记录类型),编译器将使用最后定义的类型(如果没有进一步限定),该函数的类型为'a->UserName
。从OP中不清楚这是否是所需的类型,但从LogLineType
DU的名称和存在来看,我想不是。请看我的答案。谢谢马克,顺便说一句,我喜欢你的PluralSight课程!谢谢马克,顺便说一句,我喜欢你的多视觉课程!