2013-03-24 49 views
17

Viết chương trình Haskell Tôi thấy mình cần một toán tử như thế này.:: a -> (a -> b) -> toán tử b (Haskell)

(|>) :: a -> (a -> b) -> b 
(|>) = flip ($) 
infixl 0 |> 

Tôi nghĩ nó hữu ích khi dán nhiều chức năng cùng nhau.

tText cs = someFun cs |> 
      lines  |> 
      map (drop 4) |> 
      reverse 

Tôi thích nó hơn . bởi vì với |> thứ tự mà các chức năng được áp dụng cũng giống như thứ tự mà các chức năng được viết.

tText' cs = reverse  . 
      map (drop 4) . 
      lines  . 
      someFun $ cs 

Câu hỏi là: là này (|>) cái gì đó đã tồn tại trong/một số thư viện cơ bản khác Prelude? Thực hiện lại các công cụ đơn giản là điều gì đó ngớ ngẩn mà tôi muốn tránh.

Tìm kiếm trên Hoogle không hữu ích. Điều gần nhất tôi tìm thấy là >>> (Mũi tên), nhưng có vẻ như quá mức cần thiết.

+3

Không, nó không, mặc dù như bạn nói '>>>' nào. [Có một câu hỏi SO khác về lý do tại sao F # sử dụng '|>' trong đó Haskell sử dụng '.' và' $ ', điều này khá liên quan.] (Http://stackoverflow.com/questions/1457140/haskell-composition-vs- fs-pipe-forward-operator) (Lưu ý, chỉ để cho vui, với '.' hoặc' >>> ', bạn có thể viết hàm của bạn không có điểm:' tText = reverse. map (drop 4). someFun', hoặc 'tText = someFun >>> dòng >>> map (drop 4) >>> reverse'.) –

+1

Một số thời gian trước đây, đã có một cuộc hội thoại trên danh sách gửi thư về việc thêm nó vào thư viện chuẩn. http://www.haskell.org/pipermail/libraries/2012-November/018832.html –

+4

"thứ tự các hàm được áp dụng giống với thứ tự các hàm được viết." Vâng - đó là loại suy nghĩ mà Haskellers tránh: bạn không chỉ định "làm điều này, sau đó với kết quả thực hiện, sau đó ..." nhưng tập trung vào kết quả _desired_, do đó, hoàn toàn tự nhiên để bắt đầu với bước tính toán cuối cùng. Ngoài ra, những gì với đánh giá lười biếng, bước "cuối cùng" này thực sự sẽ là người đầu tiên được đánh giá! - Đối với các loại chức năng thủ tục, những thứ mà bạn thực sự cần phải suy nghĩ trong các bước tuần tự, Haskell có Monads, có ký hiệu 'do' luôn luôn là" chuyển tiếp ". – leftaroundabout

Trả lời

16

Không, không có gì trong thư viện chuẩn mà tôi biết. Năm và năm trước rất nhiều mã của tôi nhập khẩu breif của tôi, nhưng tiện dụng Forwards mô-đun:

> module Forwards where 

> infixl 0 |> 
> infixl 9 .> 

> (|>) = flip ($) 
> (.>) = flip (.) 

Tôi thậm chí còn sử dụng tên giống như bạn!

Những ngày này tôi không sử dụng nhiều lắm - tôi đã quen với thứ tự mà thành phần chức năng sử dụng.

Hãy sử dụng phím tắt tiện dụng của riêng bạn.

Tôi cũng sử dụng $ ít hơn trước đây. Nơi mà tôi sử dụng để viết

thing = this $ that arg $ an other $ it 

Bây giờ tôi viết

thing = this . that arg . an other $ it 
12

Các lens library định nghĩa this operator as &.

+1

Và .. 'sơ đồ' định nghĩa nó là' # '. –

+0

+1 để trỏ vào ống kính. Ống kính học tập là lời khuyên tốt. – AndrewC

7

Bạn cũng có thể xác định (|>) là "lật id" và hiểu tại sao công trình này là bài học tuyệt vời trong suy luận kiểu bằng cách hợp nhất như được sử dụng trong Haskell.

0

Theo kinh nghiệm của tôi, tôi không biết bất kỳ thư viện nào như vậy. Và nếu một thư viện như vậy tồn tại, tôi khuyên bạn không nên sử dụng nó.


Trừ khi bạn đang sử dụng gói thấu kính, tôi khuyên bạn không nên sử dụng toán tử được xác định bên ngoài loại đó. (Trong trường hợp đó gói ống kính, bạn thực sự cần và đã có một nhà điều hành như vậy.)

Theo kinh nghiệm của tôi, IMHO và như vậy ...

Trong trường hợp khả năng đọc tăng cường với một phần phía trước trái ngược với thành phần thông thường (không chỉ khi giao dịch với thấu kính), có ích khi xác định toán tử đặc biệt trong mô-đun đó hoặc cục bộ qua let hoặc where. Đối với điều đó, tôi có xu hướng sử dụng các ký hiệu unicode đơn chứ không phải là combo ascii.

(·) = flip (.) 
infixl 1 (·) 

(§) = ($) -- left associative, no flip 
infixl 0 (§) 

Một vài năm trước đây (, khi không có ống kính), tôi cũng nghĩ đến việc định nghĩa mô-đun của riêng mình cho các mô-đun này. Nhưng sau đó tôi phát triển để sử dụng mô-đun sooo không thường xuyên mà tôi có xu hướng để phát minh lại bánh xe anyway. Để có các toán tử này trong thư viện thậm chí có thể tăng số nỗ lực đọc mã: Người đọc phải xem xét các toán tử hiếm khi được sử dụng đó. Trong trường hợp đó, các toán tử được định nghĩa cục bộ sẽ tốt hơn.

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