2010-11-03 39 views
32

Một câu hỏi nhanh, là có một nhà điều hành trong Haskell hoạt động như ký hiệu đô la nhưng ưu tiên cho phía bên tay trái. I E. thay vì

f (x 1) 

được viết như

f $ x 1 

Tôi muốn viết nó như

x 1 $ f 

Đây hoàn toàn là một điều phong cách. Tôi đang chạy một chuỗi các chức năng theo thứ tự và nó sẽ được tốt đẹp nếu tôi có thể viết chúng lại để viết cho phù hợp mà tôi đọc còn lại để viết. Nếu có một nhà điều hành cho điều này?

[cập nhật] Một vài người đã hỏi nếu tôi không thể định nghĩa của riêng mình. Trong câu trả lời, tôi muốn kiểm tra không có một nhà điều hành hiện có trước khi tôi phát minh lại bánh xe.

+4

này giống như nhà điều hành thành phần đường ống của F #. Thảo luận liên quan (về lý do tại sao nó không được xây dựng trong Haskell): http://stackoverflow.com/questions/1457140/haskell-composition-vs-fs-pipe-forward-operator –

+0

Có vẻ như câu trả lời cho câu hỏi của tôi là "không" .Cảm ơn bạn :) –

+2

Bạn nhận ra rằng bạn đang kết hợp cả ứng dụng từ trái sang phải và từ phải sang trái trong cùng một biểu thức, phải không? Hầu hết mọi người tôi nghĩ sẽ trở nên bực tức vì điều này. Ứng dụng ngược lại là cái gọi là T-combinator. Nó thường được biểu thị bằng (#) vài năm trước, nhưng bây giờ # là một biểu tượng đặc biệt trong GHC, vì vậy nó không còn được sử dụng nhiều nữa. –

Trả lời

19

Tôi không biết, cho dù có một nhà điều hành standart, nhưng những gì ngăn cản bạn bằng văn bản của riêng bạn? Này hoạt động trong ghci:

Prelude> let a $> b = b a 
Prelude> 1 $> (+2) 
3 
Prelude> sum [1, 2] $> (+2) 
5 
Prelude> map (+2) [1, 2] $> map (+3) 
[6,7] 

CẬP NHẬT: tìm kiếm trên hoogle cho a -> (a -> b) -> b (nó là loại toán tử này) tìm thấy điều gì hữu ích.

+4

Có vẻ tôi sẽ sử dụng điều này, cảm ơn bạn. Một bảng thu hút tôi đối với nhà điều hành. –

+5

@ Benjamin Confino: Puns luôn thú vị, nhưng để sử dụng trong thế giới thực, tôi muốn đề nghị xem xét '|>'. Như đã nói ở trên, toán tử đó trong F # thực hiện chính xác những gì bạn đang tìm kiếm, vì vậy việc sử dụng cùng một tên sẽ giúp mọi người hiểu mã của bạn dễ dàng hơn. –

+2

Đây là một trong những điểm mạnh thực sự của Haskell mà bạn có thể viết các toán tử điều khiển luồng của riêng bạn. Haskell không có cấu trúc "loop"? Không vấn đề gì! Chỉ cần viết của riêng bạn. –

-1

Bạn không thể chỉ định nghĩa lại $.

let ($) x f = f x 

Hoặc chỉ cần chọn một nhà điều hành khác nhau, như $$

+3

Xác định lại toán tử chuẩn không phải là một ý tưởng hay. – michau

4

Tôi không biết về bất kỳ phiên bản tiêu chuẩn, nhưng tôi đã nhìn thấy (#) được sử dụng cho mục đích đó trong một vài nơi. Một trong những đặc biệt mà đến với tâm là HOC, trong đó sử dụng nó trong một thành ngữ như:

someObject # someMessage param1 param2 

tôi dường như nhớ lại thấy khác thư viện "hướng đối tượng" sử dụng # điều hành trong cùng một cách, nhưng không thể nhớ bao nhiêu hoặc cái nào.

+2

Rửa sử dụng (#). Erik Meijer, Daan Leijen và James Hook sử dụng nó để viết MS Agent với Active Haskell (cây cầu Haskell-COM). Có thể cầu Haskell/ObjectiveC ban đầu cũng được sử dụng (#). –

10

combinator này được định nghĩa (lưỡi trong má) trong data-aviary gói:

Prelude Data.Aviary.BirdsInter> 1 `thrush` (+2) 
Loading package data-aviary-0.2.3 ... linking ... done. 
3 

Mặc dù thực tế sử dụng gói phần mềm đó là một điều khá ngớ ngẩn để làm, đọc nguồn là niềm vui, và tiết lộ rằng this combinator được hình thành thông qua câu thần chú của flip id (hoặc, trong cách nói của chim, cardinal idiot).

+4

'' caridinalIdiot'' là một tên tổ hợp tuyệt vời! – sclv

24

Trong Haskell bạn có thể sử dụng flip để thay đổi thứ tự tranh cãi của bất kỳ chức năng nhị phân hoặc điều hành:

ghci> let (|>) = flip ($) 
ghci> 3 |> (+4) |> (*6) 
42 
+0

Giải pháp rất bóng bẩy! –

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