tôi muốn mở rộng một trong những module "cốt lõi" hiện có, như Core.Option
:Mở rộng mô-đun Core.Option trong F #
module Microsoft.FSharp.Core.Option
let filter predicate op =
match op with
| Some(v) -> if predicate(v) then Some(v) else None
| None -> None
(tôi biết về bind
chức năng, nhưng tôi nghĩ filter
phương pháp để lựa chọn trong một số trường hợp thuận tiện hơn).
Nhưng unfortunetely tôi không thể sử dụng phương pháp filter
mà không explicitely mở Microsoft.FSharp.Core
namespace:
// 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
Trong hầu hết các trường hợp chúng tôi không thể sử dụng chức năng từ mô-đun mà không cần mở không gian tên thích hợp. Trình biên dịch F # "mở" một số không gian tên xác định (lõi) tự động (như Microsoft.FSharp.Core
), điều này sẽ không đưa vào các phương thức phạm vi từ "mở rộng mô-đun" và chúng ta vẫn nên mở các không gian tên lõi theo cách thủ công.
Câu hỏi của tôi là: Có cách giải quyết nào không?
Hoặc cách tốt nhất để mở rộng các mô-đun "cốt lõi" là tạo các tiện ích mở rộng như vậy trong không gian tên tùy chỉnh và mở không gian tên này theo cách thủ công?
// 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
không cần thiết cho các không gian tên tùy chỉnh – Taha
Tôi có rất nhiều ví dụ về điều này - bao gồm hàm chính xác bạn muốn - trong GitHub của tôi: https://github.com/jack-pappas/ExtCore/blob/master /ExtCore/Pervasive.fs –