2013-08-24 100 views
0

我有这段代码(我是Haskell的新手)。在Haskell中增加字符串标识符的数字部分

import Data.List.Split 

padL :: Int -> String -> String 
padL n s 
    | length s < n = replicate (n - length s) '0' ++ s 
    | otherwise = s 

strInc :: String -> String -> String 
strInc sep str = 
     let strarr = splitOn sep str 
      zprefix = strarr !! 0 
      znumber = strarr !! 1 
     in zprefix ++ sep ++ padL (length (znumber)) (show (read (znumber) + 1)) 

这是不好的,一般的还是很好的Haskell代码?如何改进? 谢谢。

+2

我认为Stackoverflow不是正确的地方问这个问题。该网站是关于问题,而不是代码评论。对于代码评论,有http://codereview.stackexchange.com。 – bennofs

+1

我在问我可能没有意识到的惯用Haskell。已经有一个被接受和回答的“我应该如何重构这个Haskell ...”的问题,类似于我的问题。如果有帮助,我可以在没有我的代码的情况下进行重新配置,标题对于我的问题是自我解释的。 – itmitica

+0

如果可能的话,分别维护标识符的数字部分,稍后只添加字符串部分。有一个'String - > String'类型的数字增量函数看起来很不愉快。如果你可以用自定义阅读和显示的方式将你的号码包装在'newtype'中以实现你的最终结果,那就更好了。 (不知道你在用什么,这就是为什么我不确定。) – AndrewC

回答

2
import Data.List.Split 

不害怕使用非基本包:这很好。

-- Original code 
padL :: Int -> String -> String 
padL n s 
    | length s < n = replicate (n - length s) '0' ++ s 
    | otherwise = s 

不需要的情况:这不是“坏”,而是“愚蠢”。考虑替代:

-- New code 
padL n s = replicate (n - length s) '0' ++ s 

如果length s >= n然后replicate (0 or negative) '0' == ""而这个答案是一样的,否则情况。

-- Original code 
strInc :: String -> String -> String 
strInc sep str = 
     let strarr = splitOn sep str 
      zprefix = strarr !! 0 
      znumber = strarr !! 1 
     in zprefix ++ sep ++ padL (length (znumber)) (show (read (znumber) + 1)) 

使用索引到列表(!!):(?如果什么列表是短比你预期的),这是不好的,因为它是丑陋的失败。

在使用括号的:这是恼人的

如何:

-- New code 
strInc :: String -> String -> String 
strInc sep str = 
    case splitOn sep str of 
     (zprefix:znumber:_) -> zprefix ++ sep ++ padL (length znumber) (show (read znumber + 1)) 
     _ -> "" -- some error value 

对所有很好的工作。做得很好。

+0

因此,重复使用负值。好一个。 我真的与你的strInc功能!有一件事我不得不问,为什么_作为第一个测试案例中的尾部? 谢谢! – itmitica

+0

呵呵,所以'_'只是模式匹配中一个unamed变量的符号,'zprefix:znumber:restOfList == zprefix:znumber:_'注意这与'[zprefix,znumber]'略有不同,它会只匹配两个元素的列表(而不是两个或更多元素)。 –

+0

我看到,如果我使用多个分隔符,它将只管理第二个元素,并松开尾部。顺便说一下,如何处理znumber不会转换为数字的情况,即znumber = 00001a?谢谢。 – itmitica