Tôi muốn xác định một hàm tính số phần tử trong một danh sách thoả mãn một vị đưa ra:Số phần tử trong Haskell trong phong cách pointfree
number_of_elements :: (a -> Bool) -> [a] -> Int
number_of_elements f xs = length (filter f xs)
Ví dụ:
number_of_elements (==2) [2,1,54,1,2]
nên trả lại .
Chúng tôi có thể viết nó ngắn hơn:
number_of_elements f = length . filter f
Có thể viết nó mà không f tham số?
gì bạn đang tìm kiếm được gọi là "phong cách Pointfree". Có một wiki về nó ở đây: http://www.haskell.org/haskellwiki/Pointfree. Nó dạy cho bạn tất cả các thủ thuật như cú: '((.) $ (.))' Và dấu chấm: '((.). (.))'. Mặc dù vậy, tôi sẽ không tự giới thiệu phong cách này. –
Tôi khuyên bạn nên chơi xung quanh với nó một chút, để xem nó hoạt động như thế nào, nhưng bằng cách sử dụng phong cách pointfree một phần 'number_of_elements f = length. lọc f'. Đó là điều dễ đọc nhất thường. –
Đây là hàm tôi hiếm khi bận tâm định nghĩa, vì 'length (filter f xs)' là, thẳng thắn, dễ đọc hơn 'number_of_elements f xs'. Sau này yêu cầu tôi tìm ra chức năng của bạn bằng cách tìm kiếm định nghĩa hàm, tài liệu hoặc suy luận nó từ loại; trong khi trước đây là một cách sử dụng kết hợp đơn giản của hai hàm tôi đã hiểu - và nó cũng ngắn hơn để viết! Tôi sẽ chỉ định nghĩa điều này như là một hàm phụ trợ trong một liên kết 'where', hoặc như một hàm mô-đun chưa được xuất hiện - và thậm chí sau đó chỉ khi nó sẽ là đối số cho các hàm khác. –