2013-02-18 33 views
6

Giả sử tôi có hai hàm, f:X->Yg:Y*Y->Z. Tôi muốn thực hiện chức năng thứ ba, h(a, b) = g(f(a), f(b)).chuỗi các hàm đa tham số

h a b = g (f a) (f b) 

Có cách nào để viết nó như h(a, b) = g*f (a, b) không?

Và điều gì xảy ra nếu h(a,b,c,d) = g2*g1*f2*f1 (a,b,c,d), trong đó g_i mất 2 arg?

+0

hai ví dụ của bạn là đồng bộ. Đầu tiên phải là 'g (f1 a) (f2 b)' hoặc 'g (f a) (f b) (f c) (f d)' thứ hai. –

+0

Bạn có thể viết 'h = \ a b -> g (f a) (f b)' thành 'h = (. F). g. f', nhưng bạn không nên (khả năng đọc). –

+0

trong ví dụ 2 mới của bạn, bạn có nghĩa là các hàm 'f' dùng' arg, và 'g' funcs dùng 2? Sau đó, bạn cần một cấp độ 3. Bạn có thể viết nó ra đầy đủ chính xác không? –

Trả lời

10

Tìm kiếm Hoogle cho các chức năng với right signature tiết lộ on từ Data.Function. Theo tài liệu của tài liệu,

g `on` f 

có vẻ là những gì bạn muốn.

7

Các on combinator (trong Data.Function, như đã chỉ ra bởi gspr trong câu trả lời khác) được xác định bởi

g `on` f = \x y -> g (f x) (f y) 

nào sẽ cho phép bạn viết

h = g `on` f 

Bạn có thể làm cho khái quát chiều cao của ví dụ này, ví dụ:

g `on3` f = \x y z -> g (f x) (f y) (f z) 

g `on4` f = \w x y z -> g (f w) (f x) (f y) (f z) 

Vì vậy mà bạn có thể viết

h = g `on3` f 

Có thể có một cách để viết on3on4 về on, nhưng nếu có là tôi không thể nhìn thấy nó vào lúc này.

6

Bạn cũng có thể tìm thấy Mũi tên thú vị. Dưới đây là một cách để làm điều đó:

h g f a b = uncurry g ((f *** f) (a, b)) 

Đó là tương đương với ví dụ của bạn (ngoại trừ việc gf không được tự do) và on.Sử dụng:

  • definition của *** cho các chức năng:

    (***) f g ~(x,y) = (f x, g y) 
    
  • definition của uncurry:

    uncurry f p = f (fst p) (snd p) 
    

Và thay chúng vào phương trình ban đầu:

  1. h g f a b = uncurry g (f a, f b)(sử dụng *** định nghĩa)

  2. h g f a b = g (f a) (f b)(sử dụng uncurry định nghĩa)

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