2014-04-10 11 views
8

Tôi có câu hỏi liên quan đến Data.List và chữ ký của deleteBy. Lý tưởng nhất là chức năng này sẽ đưa vào một vị từ đầu vào và xóa phần tử đầu tiên mà biến vị ngữ là đúng. Một cái gì đó như:Tại sao Data.List.deleteBy của Haskell mất đầu vào một hàm so sánh (a -> a -> Bool) và một giá trị thay vì một vị từ (a -> Bool)?

deleteBy :: (a -> Bool) -> [a] -> [a] 
deleteBy p = go 
    where go []     = [] 
      go (x:xs) | p x   = xs 
        | otherwise = x:go xs 

Thay vào đó, chức năng định nghĩa trong thư viện có cả một vị và giá trị:

deleteBy    :: (a -> a -> Bool) -> a -> [a] -> [a] 
deleteBy _ _ []  = [] 
deleteBy eq x (y:ys) = if x `eq` y then ys else y : deleteBy eq x ys 

Thật dễ dàng để thấy rằng eq luôn được sử dụng với x như là đối số đầu tiên và x là cố định trong deleteBy, vì vậy không có lý do gì để nhận cả hai số eqx thay vì eq x. Ngược lại, bằng cách dùng một vị từ làm việc trên một phần tử đơn lẻ, bạn có thể chuyển các vị từ không so sánh hai giá trị, chẳng hạn như một hàm hoạt động trên một phần của loại a hoặc một hàm nhỏ như cons true. Câu hỏi của tôi là: tại sao deleteBy đã được triển khai theo cách này?

+2

Câu trả lời có liên quan: http://stackoverflow.com/questions/9004937/is-there-a-good-reason-why-deleteby-does-not-have-its-most-general-type. Sự nhất quán với loại âm thanh '(==)' giống như một lời giải thích hợp lý. – duplode

+1

đơn giản để làm việc xung quanh mặc dù (func. Const) – PyRulez

Trả lời

11

Chức năng deleteBy là sự tổng quát hóa của delete, do đó, hữu ích khi xem delete trước tiên.

delete :: Eq a => a -> [a] -> [a] 

delete mất một giá trị Eq a => a, sau đó xóa sự xuất hiện đầu tiên của giá trị đó từ [a] sử dụng (==) từ Eq dụ.

Giống như tất cả các chức năng *By trong Data.List, ràng buộc Eq bị xóa và người lập trình được yêu cầu cung cấp chức năng thay thế (==) riêng của họ.

Vì vậy, loại bỏ các hạn chế Eq từ delete và thay thế nó bằng các loại (==), cụ thể là a -> a -> Bool, cung cấp cho bạn các loại deleteBy.

Nói cách khác, nó phù hợp với phần còn lại của các hoạt động *By trong Data.List.

+0

Tất cả những gì cho thấy 'deleteBy' nên được đưa ra về chức năng tổng quát hơn. – dfeuer

0

Khi cdk và những người khác chỉ ra. Nó là khái quát hóa về vị từ bình đẳng.

Hàm bạn đang yêu cầu là 'xóa các phần tử trong danh sách phù hợp với vị từ này'. Điều này giống với nguyên tố đơn filter.

Chức năng deleteBy là 'xóa phần tử x, nhưng sử dụng toán tử so sánh này thay vì (==)'.

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