增加Haskell中字符串标识符的数字部分

时间:2013-08-24 12:54:16

标签: string haskell increment identifier

我有这个代码(我是一个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代码?怎么改进? 感谢。

1 个答案:

答案 0 :(得分: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 ) )

使用索引到列表(!!):这很糟糕,因为它很难看并且可能会失败(如果列表比预期的要短,会怎么样?)。

过度使用parens:这很烦人

怎么样:

-- 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

在所有非常好的工作上。做得很好。