2013-02-07 18 views
5

Tôi nhận thức được (||>) mà không (a' * 'b) -> ('a -> b' -> 'c) -> 'cNhà khai thác tuple có tồn tại ở đâu đó không?

Nhưng tôi đã tìm kiếm này khá hữu ích, và tự hỏi nếu tôi đã reinventing the wheel:

// ('a * 'a) -> ('a -> 'b) -> ('b * 'b) 
let inline (|>>) (a,b) f = (f a, f b) 

(* Nó có thể xảy ra, tôi chỉ đã phát hiện hàm ceil nửa giờ trước!)

Trả lời

4

Không, không.

Tuy nhiên, bạn sẽ gặp phải biến thể của nó rất thường xuyên nếu bạn sử dụng FParsec. Dưới đây là chữ ký loại trong tài liệu của FParsec:

val (|>>): Parser<'a,'u> -> ('a -> 'b) -> Parser<'b,'u> 

Tôi nghĩ thư viện có một bộ toán tử được thiết kế rất tốt có thể được tổng quát cho các mục đích khác. Danh sách các nhà khai thác FParsec có thể được tìm thấy here.

Tôi đã làm một chút đào; Nhà điều hành |>> dường như không có built-in Haskell counterpart mặc dù dễ dàng được xác định bằng cách sử dụng Control.Arrow.

3

Toán tử mà bạn mô tả về cơ bản là hàm map cho một bộ hai phần tử. Các map chức năng, nói chung có một chữ ký (đối với một số F<'a> mà có thể là seq<'a> hoặc nhiều loại khác trong F # thư viện):

map : ('a -> 'b) -> F<'a> -> F<'b> 

Vì vậy, nếu bạn xác định F<'a> như một tuple hai yếu tố, sau đó chức năng của bạn thực sự là chỉ map (nếu bạn lật các đối số):

type F<'a> = 'a * 'a 
let map f (a, b) = (f a, f b) 

các hoạt động không tích hợp bất cứ nơi nào trong # thư viện F, nhưng nó rất hữu ích để nhận ra rằng nó thực sự phù hợp với một mô hình đó là khá phổ biến trong F # thư viện khác (danh sách, seq, mảng, v.v.)

Nhìn vào câu trả lời Haskell tham chiếu bởi @pad - về nguyên tắc, Haskell làm cho nó có thể để xác định các chức năng tương tự cho tất cả các loại có hỗ trợ các hoạt động đó sử dụng các lớp học kiểu (do đó bạn sẽ viết chỉ fmap thay vì Seq.map hoặc thay trong số TwoElementTuple.map của bạn, nhưng nó thực sự không hoạt động vì nhiều lý do kỹ thuật - vì vậy người bán hàng cần phải gọi nó theo cách khác). Trong F #, điều này không thể dễ dàng để xác định một hàm map cho các loại khác nhau, nhưng bạn vẫn có thể nghĩ chức năng của mình là map cho các bộ hai phần tử (ngay cả khi bạn thấy dễ dàng hơn tên nhà điều hành, thay vì tên map.)

+0

Quan sát tốt, tôi sẽ xem xét đổi tên nó thành 'bản đồ' ... nhưng tôi phải thừa nhận tôi thích ngữ nghĩa đường ống .. – Benjol

+1

Tôi nghĩ sử dụng tên tượng trưng ở đây có lẽ đẹp hơn - nó thực sự phụ thuộc vào cách sử dụng cụ thể của bạn. (Nhưng tôi không phải là một fan hâm mộ lớn của các tên biểu tượng, nói chung, bởi vì tôi thấy họ khó giải mã hơn.) –

Các vấn đề liên quan