2013-06-02 48 views
13

Tôi đã tự hỏi nếu nó đã có thể làm thành phần chức năng với các chức năng mà có nhiều hơn một đối số. Tôi muốn có thể làm điều gì đó như thế nàyThành phần chức năng với hàm đa giá trị trong haskell?

x = (+3).(*) 

cài đặt x bằng chức năng thêm ba vào sản phẩm của hai số.

+4

http://conal.net/blog/posts/semantic-editor-combinators – luqui

+1

[This] (http://stackoverflow.com/questions/9656797/variadic-compose-function) có thể là những gì bạn đang tìm kiếm . – is7s

Trả lời

23

Có nhiều cách để thực hiện điều đó, nhưng tất cả đều hơi khó xử.

((+3).) . (*) 
≡ fmap (+3) . (*) 
≡ curry $ (+3) . uncurry (*) 
≡ \l r -> l*r + 3 

Oh, chờ đợi, đây là chữ ký ở đâu đó cũng là một nét nhỏ gọn, đoán những gì nó được gọi là ...

((.).(.)) (+3) (*) 

Tôi muốn lập luận rằng các giải pháp lambda, là rõ ràng nhất, là thay vì tốt nhất ở đây.

giúp gì, và thường được thực hiện chỉ tại địa phương như một (hoặc hai) -liner, là để xác định thành phần này như một trung tố tùy chỉnh:

(.:) :: (c->d) -> (a->b->c) -> a->b->d 
f .: i = \l r -> f $ i l r 

nào cho phép bạn viết đơn giản (+3) .: (*).

BTW, tương tự (b->b->c) -> (a->b) -> a->a->c (đặt trước hàm đúng cho cả hai đối số của thông số này) tồn tại a widely-used standard implementation.

+1

Tôi thích '((.). (.))' Là tốt nhất, chủ yếu là vì tôi thích tưởng tượng [Frankie Howerd] (http://en.m.wikipedia.org/wiki/Frankie_Howerd) đã phát hiện ra nó –

+0

+1 cho fmap (coolest) và lambda (cái tôi muốn trong bất kỳ codebase nào mà tôi đang làm việc!) – monk

+0

yes - lấy lambda hoặc tốt hơn là đặt tên cho hàm - trong tất cả sự trung thực: các giải pháp khác là dễ chịu hơn nhưng nhiều hơn hoặc ít đọc được hơn (bạn có thể tìm lại chúng dễ dàng nhưng tôi có thể nói là không thể đọc được) - những thứ như thế này cho Haskell đó là nhãn "tháp mun phức tạp" không khuyến khích nhiều nhà phát triển giỏi nhìn vào Haskell – Carsten

2

Bạn cũng có thể sử dụng B1 hoặc combinator blackbird từ Data.Aviary.Birds. Tôi nghĩ cho công việc thực sự tôi sẽ sử dụng một lambda mặc dù.