Las dos funciones siguientes son extremadamente similares. Leen elementos de [String] n, ya sea [Int] o [Float]. ¿Cómo puedo factorizar el código común? No conozco ningún mecanismo en Haskell que admita pasar tipos como argumentos.Pass Types como argumentos para una función en Haskell?
readInts n stream = foldl next ([], stream) [1..n]
where
next (lst, x:xs) _ = (lst ++ [v], xs)
where
v = read x :: Int
readFloats n stream = foldl next ([], stream) [1..n]
where
next (lst, x:xs) _ = (lst ++ [v], xs)
where
v = read x :: Float
Estoy en el nivel de principiante de Haskell, por lo que cualquier comentario sobre mi código es bienvenido.
No es necesario a veces aquí, se puede llegar a funcionar con un mapa sencillo. p.ej. 'map read stream :: [Int]' También es posible que desee ver por qué quiere usar foldr en Haskell en lugar de foldl. –
@EdwardKmett Gracias por su sugerencia. Lo que realmente quiero es leer solo n primeros elementos y devolver la lista y el resto de la secuencia. Ayer estuve soñoliento y no pude pensar bien. Creo que quieres decir que con foldr puedo usar el constructor: directamente ¿no? Más tarde lo reescribí como '(map read firstn, rest) donde (firstn, rest) = splitAt n stream', bastante similar a lo que sugeriste. –
No necesita anidar 'donde'; puede poner 'next (lst, x: xs) _ = ...' y 'v = ...' en líneas consecutivas. – sdcvvc