f# - 如何避免在 F# 中双重包装到 Some

标签 f#

我有以下代码:

let f g x = if x < 0 then None else Some(g x)

随着f g函数可能会也可能不会返回 Option以及。自 f将其设为通用并且没有任何通用约束我最终可以拥有 Some(Some(z))其结果。如果事实上我想要的只是 NoneSome(z) .如何避免双重包装(最好不要对 g 施加限制)?

最佳答案

> let f g x = if x < 0 then None else Some(g x)

val f : g:(int -> 'a) -> x:int -> 'a option
f返回 'a option这意味着它可以返回 Some zSome (Some y)f可以返回带有任意数量嵌套 Some 的结果s 取决于 关于 g 的类型.

如果我答对了这个问题,那就是关于折叠嵌套的函数 Some s。它可以手动编写:
let collapseOptions x =
    match x with
    | Some (Some y) -> y
    | _ -> None

如果这个问题是关于折叠所有嵌套的函数 Some s,我想看看它的签名:)

关于f# - 如何避免在 F# 中双重包装到 Some,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19062760/

相关文章:

f# - Mono AOT/mkbundle是如何使用和优化的? (用于减少虚拟机启动延迟)

f# - 模式匹配语法中的歧义

.net - 为什么我的 F# 函数在使用 Array.iter 时会导致越界错误?

function - F# 将 Seq 的每个元素分别 append 到另一个元素,然后对每个元素应用一个函数

f# - F# 管道运算符的工作原理

f# - 递归爬取各种记录类型列表的层次结构

f# - 本例中的 `in` 关键字是什么意思(F#)

f# - 数学序列进一步的元素

F#运算符重载之谜2

f# - 通过翻译 ML 的等效项来使用 F# 实现 take