Chúng tôi được sử dụng để foldr
trong Haskell nơi bạn lấy (ví dụ, sử dụng cú pháp Java) List<T>
và bạn trả về bất kỳ loại nào bạn muốn (<T>
, List<T>
, v.v.).Tương đương foldr của Haskell trong Java 8
Ví dụ trong Haskell, chức năng này mà phải mất một List<Integer>
và trở List<Integer>
khác và sử dụng như một ắc một List<Integer>
(được chỉ là ví dụ, các objetive của hàm không quan trọng):
evens :: [Integer] -> [Integer]
evens = foldr (\ x acc -> if mod x 2 == 0 then x : acc else acc) []
Bây giờ Java 8 là ra ngoài và có các tính năng chức năng theo phong cách, chúng tôi muốn chức năng ghi (không chỉ tương đương với sự trùng lặp miễn phí của một List<T>
) với một loại foldr
như chúng ta sử dụng ở đây:
public static Double entropy (List<Double> probs){
return -probs.stream().reduce(0.0, (acc, p) -> acc + p * Math.log(p, 2));
}
Sự cố khi sử dụng reduce
là khi chúng tôi lấy số List<T>
, chúng tôi chỉ có thể trả lại một số <T>
và chúng tôi muốn trả về một loại khác hoặc thậm chí là một bộ sưu tập.
Có cách nào để thực hiện foldr
trong Java 8 không?
Bạn có thể cung cấp đầu vào/đầu ra mẫu để hiểu rõ hơn nhu cầu không? – Tunaki
Nếu tôi đọc quyền Haskell (Tôi chưa bao giờ làm Haskell nhưng tôi có thể thử), có vẻ như bạn chỉ lọc các phần tử và thu thập chúng thành một danh sách. Điều này sẽ là: bộ lọc 'probs.stream(). (I -> i% 2 == 0) .collect (toList())'. – Tunaki
@Tunaki Vấn đề là chúng ta cần một loại bộ tích lũy như một cái trong ví dụ mà chúng tôi đã cung cấp. – Nico