2013-09-28 146 views
9

Thành phần của f và g trông giống nhưMột mô hình phổ biến liên quan đến thành phần của chức năng ( a b -> f (g a) (g b))

f :. g = \a b -> f (g a) (g b) 

là một mô hình tôi thấy rất thường xuyên trong mã của tôi. Nó tương tự như thành phần hàm unary, chỉ f là nhị phân và tôi muốn g áp dụng cho cả hai đối số trước khi chúng được chuyển đến f.

Khi tôi hỏi lambdabot để chuyển đổi này để hình thành điểm miễn phí, tôi nhận được câu thần chú kỳ lạ

mà tôi không muốn có trong mã của tôi, vì vậy tôi kết thúc chỉ viết ra mô hình một cách rõ ràng .

Có cách nào được chấp nhận phổ biến để viết bộ kết hợp cho tình huống này không? Hay tôi kỳ lạ vì đã tìm thấy chính mình trong tình huống này khá nhiều?

Tôi không có ví dụ thực tế khi tôi sử dụng nó ngay bây giờ vì tôi chưa bao giờ nghĩ đến yêu cầu ở đây khi tôi cần nó, nhưng người ta có thể tưởng tượng viết công thức khoảng cách euclide rất gọn gàng với nó, như vậy:

distance = sqrt . (+) :. (^2) 
+2

'flip' có thể được loại bỏ: '(g.). f. g' –

Trả lời

24

Chức năng này được gọi là on trong mô-đun Data.Function.

Thông tin thường được sử dụng, chẳng hạn như sqrt . (+) `on` (^2).

+2

Tôi không thể tin rằng tôi không nghĩ về điều này! Cảm ơn nhiều. – kqr

+0

Một ví dụ phổ biến của việc sử dụng là 'sortBy (so sánh \' trên \ 'abs)' –

+0

Tôi sẽ lưu ý cho người dùng Google trong tương lai, tuy nhiên 'so sánh abs' thành ngữ hơn' 'so sánh' on' abs''. Điều này làm việc vì 'compare = on compare' được định nghĩa ở đâu đó trong các thư viện chuẩn. – kqr

2

Đừng cố gắng viết nó theo kiểu điểm miễn phí. Đây là một ví dụ về thực tế rằng điểm miễn phí thường không thể đọc được.

Chỉ cần xác định nó thusly:

(:.) :: (b -> b -> c) -> (a -> b) -> (a -> a -> c) 
infixr 9 (:.) 
f :. g x y = f (g x) (g y) 
+0

Một toán tử infix ở đây là vấn đề, đặc biệt là vì nhiều người sử dụng ': .' hoặc'.: 'Cho' (.). (.) ' – jozefg

+0

@jozefg Đừng bắn sứ giả - đó là biểu tượng OP được sử dụng trong câu hỏi. –

+0

@jozefg Tôi cố tình chọn ': .' như một song song với'.: 'Mà thực sự thường được sử dụng cho toán tử cú. Tôi xem nó như là '.:' Có một hàm của một đối số ở bên trái (do đó là dấu chấm) và một hàm của hai đối số ở bên phải (do đó các dấu chấm kép) - vì vậy ': .' nên có một hàm của hai đối số ở bên trái và một hàm của một đối số ở bên phải. – kqr