这是 F# 中的一个选项类型:
type Option<'a> =
| Some of 'a
| None
假设我有一个
Option
的 Option
:type Option2<'a> =
| O of Option<'a>
| None
它是否会折叠成一个
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
您可以使用类型别名,但可以同时使用:
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
关于f# - 选项类型会崩溃吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41123234/