我想扩展现有的“核心”模块之一,例如Core.Option
:
module Microsoft.FSharp.Core.Option
let filter predicate op =
match op with
| Some(v) -> if predicate(v) then Some(v) else None
| None -> None
(我知道bind
函数,但我认为filter
在某些情况下选项的方法更方便)。
filter
但不幸的是,如果没有明确打开命名空间,我就无法使用方法Microsoft.FSharp.Core
:
// Commenting following line will break the code!
open Microsoft.FSharp.Core
let v1 = Some 42
let v2 = v1 |> Option.filter (fun v -> v > 40)
printfn "v2 is: %A" v2
在大多数情况下,如果不打开适当的命名空间,我们就无法使用模块中的函数。F# 编译器自动“打开”一些预定义(核心)命名空间(如Microsoft.FSharp.Core
),这不会将“模块扩展”中的方法引入范围,我们仍然应该手动打开核心命名空间。
我的问题是:有什么解决方法吗?
或者扩展“核心”模块的最好方法是在自定义命名空间中创建这样的扩展并手动打开这个命名空间?
// Lets custom Option module in our custom namespace
module CustomNamespace.Option
let filter predicate op = ...
// On the client side lets open our custom namespace.
// After that we can use both Option modules simultaneously!
open CustomNamespace
let v1 = Some 42
let b =
v1 |> Option.filter (fun v -> v > 40) // using CustomNamespace.Option
|> Option.isSome // using Microsoft.FSharp.Core.Option