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