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

String 递增Haskell中字符串标识符的数字部分,string,haskell,increment,identifier,String,Haskell,Increment,Identifier,我有这个代码(我是Haskell的新手) import Data.List.Split padL::Int->String->String 帕德尔n s |长度sString->String strInc sep str= 设strarr=splitOn-sep-str zprefix=strarr!!0 znumber=strarr!!1. 在zprefix++sep++padL(长度(znumber))(显示(读取(znumber)+1)) 它是坏的、一般的还是好的Haskell代码?如何

我有这个代码(我是Haskell的新手)

import Data.List.Split
padL::Int->String->String
帕德尔n s
|长度sString->String
strInc sep str=
设strarr=splitOn-sep-str
zprefix=strarr!!0
znumber=strarr!!1.
在zprefix++sep++padL(长度(znumber))(显示(读取(znumber)+1))
它是坏的、一般的还是好的Haskell代码?如何改进? 谢谢

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

-- Original code
padL :: Int -> String -> String
padL n s
    | length s < n = replicate (n - length s) '0' ++ s
    | otherwise = s
如果
length s>=n
复制(0或负)'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

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

我认为Stackoverflow不是问这个问题的合适地方。该网站关注的是问题,而不是代码审查。对于代码审查,有。我问的是我可能不知道的惯用Haskell。已经有一个被接受和回答的问题“我应该如何重构这个Haskell…”,类似于我的问题。如果有帮助的话,我可以不用我的代码重新格式化,标题对我的问题是什么是不言自明的。如果可能的话,单独维护标识符的数字部分,以后只添加字符串部分。拥有
String->String
类型的数值递增函数似乎令人不快。如果你能将你的号码包装在一个
newtype
中,通过自定义的读取和显示来实现你的最终结果,那就更好了。(不确定你用这个做什么,这就是我不确定的原因。)这是一个学习练习。这是“你用那种语言怎么做”的一部分。我在Haskell中提出了上面的代码,但我想对我个人的Haskell开发进行仔细检查。因此,replicate使用负值。不错。我真的很喜欢你的strInc功能!有一件事我必须问,为什么在这个案例的第一个测试案例中u作为尾部?谢谢你!啊,所以
只是模式匹配中未指定变量的符号,
zprefix:znumber:restOfList==zprefix:znumber:\u
注意这与
[zprefix,znumber]
稍有不同,后者只会匹配两个元素的列表(而不是两个或多个元素)。我知道,如果我使用多个分隔符,它将只管理第二个元素,并松开尾部。顺便问一下,我如何处理znumber不转换为数字的情况,即znumber=00001a?谢谢。您可以使用readMaybe和pattern match,也可以使用
maybe
功能。
-- New code
padL n s = replicate (n - length s) '0' ++ s
-- 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