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课程!谢谢马克,顺便说一句,我喜欢你的多视觉课程!