代码之家  ›  专栏  ›  技术社区  ›  itmitica

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

  •  0
  • itmitica  · 技术社区  · 11 年前

    我有这个代码(我是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 回复  |  直到 11 年前
        1
  •  2
  •   Thomas M. DuBuisson    11 年前
    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
    

    总而言之,做得很好。做得不错。