f# - 选项类型会崩溃吗?

标签 f# optional

这是 F# 中的一个选项类型:

type Option<'a> =
   | Some of 'a
   | None

假设我有一个 OptionOption :
type Option2<'a> =
   | O of Option<'a>
   | None

它是否会折叠成一个 Option ?

最佳答案

不,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

您可以使用类型别名,但可以同时使用:
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/

相关文章:

f# - F# 中的教会数字

f# - 在 C# 中使用 F# 选项。例如FSharpOption<字典<Guid, MembershipUser>>

java - optional ifPresent 调用对象方法

c++ - 提供 optional 参数的现代 C++ 方法

c++ - 返回完整或空 std::optional 时的 If-then-else 与三元运算符

list - 从F#中的列表中删除Nans

f# - F#中的循环列表

java - 如果使用Java 8 Streams列表为空,则返回默认列表?

f# - Ionide:如何指定 FSharpLint 的配置?

java - 使用 void 方法跨 Optional 映射的惯用方式