我试图通过1功能上用分隔符分隔字符串的最佳方法是什么?
写在Haskell程序,将采取由逗号定界整数一串数字,将其转换为整数的列表,并增加每个号码例如 "1,2,-5,-23,15" -> [2,3,-4,-22,16]
下面是生成的程序
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
对我来说,最困难的部分是一个字符串并将返回字符串
列表的功能splitByDelimiter
编程
"1,2,-5,-23,15" -> ["1","2","-5","-23","15"]
认为它工作,我不满意它的写法。有很多括号,所以它看起来像Lisp。同样的算法是有点人为:
前面加上分隔字符串的开头
",1,2,-5,-23,15"
生成所有的尾巴
[",1,2,-5,-23,15", "1,2,-5,-23,15", ",2,-5,-23,15", .... ]
过滤器的列表,只留下与分隔符开头的字符串
[",1,2,-5,-23,15", ",2,-5,-23,15", .... ]
放下第一个分隔符并采用符号,直到达到下一个分隔符
["1", "2", .... ]
所以问题是:
我怎样才能改善功能splitByDelimiter
?
我可以删除前缀和删除分隔符并直接拆分字符串吗?
如何重写函数以减少括号?
可能我错过了一些东西,并且已经有了这个功能的标准功能?
`foldr相似(++)[] `也被称为`concat`,`putStrLn。 show`也被称为`print`。另外,`n < - return 1`有点奇怪;你可以做'让n = 1'并避免包装和解开monad。 – pat 2013-02-27 02:36:30
可能的重复[如何在Haskell中拆分字符串?](http://stackoverflow.com/questions/4978578/how-to-split-a-string-in-haskell) – 2014-07-02 15:39:42