我有这个代码(我是一个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代码?怎么改进? 感谢。
答案 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
在所有非常好的工作上。做得很好。