0

我有这个代码(我是 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 代码?如何改进?谢谢。

4

1 回答 1

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

总之非常好的工作。做得很好。

于 2013-08-24T14:28:32.343 回答