选项类型崩溃了吗?

sdg*_*sdh 6 f# optional

这是F#中的选项类型:

type Option<'a> =
   | Some of 'a
   | None
Run Code Online (Sandbox Code Playgroud)

假设我有Option一个Option:

type Option2<'a> =
   | O of Option<'a>
   | None
Run Code Online (Sandbox Code Playgroud)

它会被折叠成一个Option吗?

Car*_*Dev 5

不,F#有一个名义上的类型系统.结构上等同的类型不兼容.所以,即使你有OptionOption2一模一样(除了名字),这些类型会有所不同.您的情况不同,类似于询问整数列表和整数列表是否相同.

let hasOptionType (_ : Option<_>) = ()
let hasOption2Type (_ : Option2<_>) = ()

let o = Option.None
let o2 = Option2.None

hasOptionType o
//hasOption2Type o // does not compile
//hasOptionType o2 // does not compile
hasOption2Type o2
Run Code Online (Sandbox Code Playgroud)

您可以使用类型别名,但两种方式都可以:

type IntOption = Option<int>

let isOptionOfInt (_ : Option<int>) = ()
let isIntOption (_ : IntOption) = ()

let i = IntOption.None
let i2 = Option<int>.None

isOptionOfInt i
isOptionOfInt i2
isIntOption i
isIntOption i2
Run Code Online (Sandbox Code Playgroud)