Hãy nói rằng tôi có một danh sách và một bộ và tôi muốn làm một số thứ với họ:F #: giết chết dư thừa trong Bản đồ/Giảm/Lọc
let outA = inA |> List.map(fun x -> x + 1) |> List.filter(fun x -> x > 10)
let outB = inB |> Set.map(fun x -> x + 1) |> Set.filter(fun x -> x > 10)
Bây giờ, rõ ràng Một xử lý danh sách và B xử lý bộ. Tuy nhiên, tôi thấy rất khó chịu khi phải viết List.
List.
nhiều lần: không chỉ là bản mẫu tiết kiệm, lặp đi lặp lại mà truyền tải không có thông tin và nhận được cách đọc chức năng của mã, nó cũng là một thực tế nhập chú thích mà tôi phải theo dõi và tiếp tục đồng bộ với phần còn lại của mã.
Những gì tôi muốn để có thể làm là một cái gì đó như sau:
let outA = inA |> map(fun x -> x + 1) |> filter(fun x -> x > 10)
let outB = inB |> map(fun x -> x + 1) |> filter(fun x -> x > 10)
Với trình biên dịch biết rằng Ina là một danh sách và INB là một tập hợp, và do đó tất cả các hoạt động được từ lớp đúng và do đó outA là một danh sách và outB là một tập hợp. Tôi có thể đạt được điều này một phần với Seq:
let map(x) =
Seq.map(x)
let filter(x) =
Seq.filter(x)
Và tôi có thể viết chính xác điều đó. Vấn đề với điều này là nó đưa mọi thứ vào Sequences, và tôi không còn có thể thực hiện các hoạt động danh sách/thiết lập trên chúng nữa. Tương tự,
let outA = inA.Select(fun x -> x + 1).Where(fun x -> x > 10)
let outB = inB.Select(fun x -> x + 1).Where(fun x -> x > 10)
Cũng loại bỏ tất cả điều đó, nhưng sau đó chuyển mọi thứ tới IEnumerable. Tôi quản lý để có được nó khá đẹp bằng cách chuyển đổi tất cả các phương pháp tĩnh vào phương pháp dụ thông qua phần mở rộng:
type Microsoft.FSharp.Collections.List<'a> with
member this.map(f) = this |> List.map(f)
member this.filter(f) = this |> List.filter(f)
let b = a.map(fun x -> x + 1).filter(fun x -> x > 10)
nhưng tôi nghi ngờ rằng sẽ gặp những vấn đề kiểu suy luận đề cập ở đây: Method Chaining vs |> Pipe Operator? Tôi không thực sự biết; Tôi không quen thuộc với cách thuật toán suy luận kiểu hoạt động.
Điểm mấu chốt là, tôi hình dung tôi sẽ làm rất nhiều công việc trong danh sách/bộ/bản đồ mảng/giảm/lọc và tôi muốn làm cho chúng trông đẹp và sạch sẽ nhất có thể. Ngay bây giờ, ngoài việc phân tâm tôi khỏi các bit quan trọng trong biểu thức (tức là "bản đồ" và lambda), chúng cũng cung cấp chú thích loại thực tế ở một nơi mà trình biên dịch nên biết rõ bộ sưu tập tôi là gì đi qua là. Hơn nữa, đây chính xác là điều mà sự thừa kế và đa hình OO có nghĩa là để giải quyết, vì vậy tôi đã tự hỏi nếu có một số mô hình chức năng tương đương mà tôi không biết rằng sẽ giải quyết nó chỉ là một cách thanh lịch. Có lẽ tôi có thể thực hiện kiểm tra kiểu trong static map
tĩnh của riêng mình và thực hiện chức năng map
của loại có liên quan trên đầu vào?
Có ai có bất kỳ giải pháp nào tốt hơn những gì tôi đã thử hay không, tôi có bị giới hạn cơ bản về động cơ suy luận kiểu F # không, tôi có nên chấp nhận và tiếp tục không?
Theo ý kiến của tôi, tên mô-đun làm cho mã mô tả hơn. Bạn biết rằng đó là một List/Set, chỉ bằng cách nhìn vào mã. – ebb
Về cơ bản bạn muốn loại lớp :) Thanh toán Haskell, hoặc ở lại với chúng tôi và sử dụng tên đủ điều kiện. –
@ebb: Nhưng điểm suy luận kiểu là tôi không cần mô tả mã quá nhiều = D. –