Traté de escribir el programa en Haskell, que tendrá una cadena de números enteros delimitados por comas, convertirlo a la lista de números enteros y el incremento por cada número 1.¿Cuál es la mejor manera de dividir una cadena por un delimitador de manera funcional?
Por ejemplo "1,2,-5,-23,15" -> [2,3,-4,-22,16]
A continuación se el programa resultante
import Data.List
main :: IO()
main = do
n <- return 1
putStrLn . show . map (+1) . map toInt . splitByDelimiter delimiter
$ getList n
getList :: Int -> String
getList n = foldr (++) [] . intersperse [delimiter] $ replicate n inputStr
delimiter = ','
inputStr = "1,2,-5,-23,15"
splitByDelimiter :: Char -> String -> [String]
splitByDelimiter _ "" = []
splitByDelimiter delimiter list =
map (takeWhile (/= delimiter) . tail)
(filter (isPrefixOf [delimiter])
(tails
(delimiter : list)))
toInt :: String -> Int
toInt = read
la parte más difícil para mí fue la programación de la función splitByDelimiter
que toman una cadena y la lista de regreso de Cuerdas
"1,2,-5,-23,15" -> ["1","2","-5","-23","15"]
Pensé que funcionaba, no estoy contento con la forma en que está escrito. Hay muchos paréntesis, así que luce como Lisp. Asimismo, el algoritmo es algo artificial:
Prepend delimitador de comienzo de la cadena de
",1,2,-5,-23,15"
lista de todas las colas
[",1,2,-5,-23,15", "1,2,-5,-23,15", ",2,-5,-23,15", .... ]
Filtrar Generar y dejó sólo cadenas que comienza con delimitador
[",1,2,-5,-23,15", ",2,-5,-23,15", .... ]
Suelta el primer delimitador y toma los símbolos hasta que se cumpla el siguiente delimitador
["1", "2", .... ]
Así que las preguntas son:
¿Cómo puedo mejorar la función splitByDelimiter
?
¿Puedo eliminar anteponer y soltar el delimitador y hacer una división directa de la cadena?
¿Cómo puedo reescribir la función para que haya menos paréntesis?
¿Puedo perder algo y ya hay una función estándar con esta funcionalidad?
'foldr (++) [] 'también se conoce como' concat', 'putStrLn. show' también se conoce como 'print'. Además, 'n <- return 1' es un poco extraño; simplemente puede hacer 'let n = 1' y evitar envolver y desenvolver la mónada. – pat
posible duplicado de [¿Cómo dividir una cadena en Haskell?] (Http://stackoverflow.com/questions/4978578/how-to-split-a-string-in-haskell) –