Vì vậy, hãy kiểm tra các loại các chức năng liên quan đến
Prelude> :t (\i -> case i of { True -> (1+) ; False -> (0+) })
(\i -> case i of { True -> (1+) ; False -> (0+) }) :: (Num t) => Bool -> t -> t
Prelude> :t foldl
foldl :: (a -> b -> a) -> a -> [b] -> a
Vì vậy cho danh sách các Bool
s, b là Bool, nhưng các chức năng bạn đang sử dụng có Bool
như là đối số đầu tiên, không phải là thứ hai . Giá trị tích lũy là đối số đầu tiên. Vì vậy, thay vào đó bạn có thể làm
foldl (\acc p -> case p of { True -> acc + 1 ; False -> acc }) 0
Hoặc nếu bạn chỉ muốn sửa chữa để tranh luận, sử dụng chức năng ban đầu của bạn với flip
Prelude> :t flip
flip :: (a -> b -> c) -> b -> a -> c
foldl (flip (\i -> case i of
True -> (1+)
False -> (0+)
)) 0
Hoặc bạn có thể gọn gàng hơn: foldl (flip ((+) . fromEnum)) 0
Nguồn
2009-02-21 21:20:22
Hàm lambda của bạn (\ i -> i) được gọi là "id". Vì vậy, có thể được giảm xuống còn count = length. id bộ lọc –