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ố eq
và x
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?
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
đơn giản để làm việc xung quanh mặc dù (func. Const) – PyRulez