”。但是,当将返回“简单”值的函数与返回“Option-Typed-values”的函数混合时,事情会变得有点困惑,例如: // foo: int -> int*int -6ren">
gpt4 book ai didi

f# - 是一个 "optionalized"管道操作符惯用的 F#

转载 作者:行者123 更新时间:2023-12-04 13:06:56 25 4
gpt4 key购买 nike

我喜欢经常使用管道运算符“|>”。但是,当将返回“简单”值的函数与返回“Option-Typed-values”的函数混合时,事情会变得有点困惑,例如:

// foo: int -> int*int
// bar: int*int -> bool
let f (x: string) = x |> int |> foo |> bar

有效,但它可能会抛出“System.FormatException:...”

现在假设我想通过让函数 'int' 给出一个可选结果来解决这个问题:
let intOption x = 
match System.Int32.TryParse x with
| (true, x) -> Some x
| (false,_) -> None

现在唯一的问题当然是函数
let g x = x |> intOption |> foo |> bar

由于打字错误而无法编译。好的,只需定义一个“可选”管道:
let ( |= ) x f = 
match x with
| Some y -> Some (f y)
| None -> None

现在我可以简单地定义:
let f x = x |> intOption |= foo |= bar

一切都像魅力一样。

好的,问题:这是惯用的 F# 吗?可以接受吗?作风不好?

备注:当然,给定正确的类型,'|=' 运算符允许随意拆分和合并带有选项的“管道”,而只关心重要的选项:
x |> ...|> divisionOption |= (fun y -> y*y) |=...|>...

最佳答案

我认为使用 Option.map 会更惯用:

let g x = x |> intOption |> Option.map foo |> Option.map bar

关于f# - 是一个 "optionalized"管道操作符惯用的 F#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33806543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com