Tôi không nghĩ ra bất kỳ lý do chính xác nào để xác định Array.get
và List.nth
theo cách này. Cho rằng pipeplining là rất phổ biến trong F #, họ nên đã được xác định để các đối số source
đến cuối cùng.
Trong trường hợp List.nth
, nó không thay đổi nhiều vì bạn có thể sử dụng Seq.nth
và thời gian phức tạp vẫn là O(n)
nơi n
là chiều dài của danh sách:
[1..100] |> Seq.nth 10
Nó không phải là một ý tưởng tốt để sử dụng Seq.nth
trên mảng vì bạn mất quyền truy cập ngẫu nhiên. Để giữ O(1)
thời điểm Array.get
chạy, bạn có thể định nghĩa:
[<RequireQualifiedAccess>]
module Array =
/// Get n-th element of an array in O(1) running time
let inline nth index source = Array.get source index
Nhìn chung, trình tự lập luận khác nhau có thể được giảm bớt bằng cách sử dụng flip
chức năng:
let inline flip f x y = f y x
Bạn có thể sử dụng nó trực tiếp trên các chức năng trên:
[1..100] |> flip List.nth 10
[|1..100|] |> flip Array.get 10
Nó thực hiện thủ thuật, nhưng tôi không thích khả năng đọc của nó - rất ngột ngạt! –
@PaulJurczak Tuyệt đối, đó là một vấn đề về phong cách. Cá nhân, tôi yêu thích các toán tử, nhưng chúng tự nhiên có [hạn chế] (Fstackoverflow.com/a/12499093/974789) trong F #, vì vậy nó là một sự lựa chọn giữa 'flip', các phương thức mở rộng và' <| '. Có vẻ như không có ý tưởng nào tốt hơn. – bytebuster
+1 'not' và' defaultArg' khiến tôi quen với việc sử dụng '<|'; nó không có vẻ khó xử như vậy một khi bạn quen với nó. – ildjarn