【发布时间】:2010-12-21 21:12:39
【问题描述】:
我尝试在 Haskell 中编写程序,该程序将采用逗号分隔的整数字符串,将其转换为整数列表并将每个数字递增 1。
例如
"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有点奇怪;你可以只做let n = 1并避免包装和解开单子。