2012-11-20 33 views
6

Tôi muốn viết một hàm point-miễn phí trong Haskell, để giữ cho mọi thứ đơn giản cho phép nói rằng tôi muốn thực hiện chức năng này:Dot nhà điều hành trong Haskell với đa số chức năng

maxmin :: Ord a => a -> a -> a -> a 
maxmin a b c = max a (min b c) 

tôi có thể cải thiện điều này để

maxmin a b = (max a) . (min b) 

nhưng có cách nào để loại bỏ a và b không?

+7

Điểm miễn phí là mã * phong cách * và chỉ nên sử dụng như vậy khi cải thiện khả năng đọc; các trường hợp ký hiệu điểm miễn phí biên dịch khác nhau (vì nội tuyến) không phải là điều bạn phải lo lắng về tổng thể (suy nghĩ về điều đó sau khi lược tả). Trong trường hợp của bạn, tôi muốn nói rằng không có điểm không giúp đỡ; đổi tên 'maxmin' thành' constrainTo' sẽ là một sự thay đổi nhiều biểu cảm hơn, ví dụ. – David

Trả lời

8

tôi sẽ không nói điều này là đơn giản hơn nhưng ở đây bạn đi:

maxmin :: Ord a => a -> a -> a -> a            
maxmin = (. min) . (.) . max 

(tạo với pl công cụ từ lambdabothttp://www.haskell.org/haskellwiki/Pointfree)

lambdabot> pl maxmin a b c = max a (min b c) 
maxmin = (. min) . (.) . max 
3

Bạn chỉ cần sử dụng "three laws of sections" cho rằng,

(a `op` b) = (a `op`) b = (`op` b) a = op a b 

sao cho

import Control.Arrow 

maxmin a b = (max a) . (min b) 
      = (.) (max a) (min b) 
      = uncurry (.) (max a, min b) 
      = uncurry (.) . (max *** min) $ (a, b) 
      = curry (uncurry (.) . (max *** min)) a b 

cũng không thể đọc được. :)