una tuplas superior sobre orden multiplicar listas lista infinitas funciones funcion eliminar elemento ejercicios drop basico haskell functional-programming count

haskell - tuplas - Usando foldl para contar el número de valores verdaderos



listas infinitas haskell (2)

Así que vamos a ver los tipos de funciones involucradas

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

Entonces, para su lista de Bool , b es Bool, pero la función que está usando tiene a Bool como primer argumento, no como segundo. El valor acumulado es el primer argumento. Entonces, en cambio, podrías hacer

foldl (/acc p -> case p of { True -> acc + 1 ; False -> acc }) 0

O si simplemente desea arreglar el orden de los argumentos, use su función original con flip

Prelude> :t flip flip :: (a -> b -> c) -> b -> a -> c foldl (flip (/i -> case i of True -> (1+) False -> (0+) )) 0

O puede ser más sucinto: foldl (flip ((+) . fromEnum)) 0

Estoy tratando de encontrar la forma de hacer la siguiente función con foldl:

count a = length (filter (/i -> i) a)

Simplemente cuenta el número de valores que son verdaderos en una lista de booleanos. Lo intenté yo mismo con

count = foldl (/i -> case i of True -> (1+) False -> (0+) ) 0

Que ni siquiera compiló. ¿Alguna sugerencia?


Qué tal si:

count = foldl (/i v -> if v then i + 1 else i) 0

Otra forma de hacerlo sin foldl :

count list = sum $ map fromEnum list

Crédito a Logan por señalar fromEnum . No había oído hablar de eso antes.