2013-08-24 78 views
0

我有這段代碼(我是Haskell的新手)。在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代碼?如何改進? 謝謝。

+2

我認爲Stackoverflow不是正確的地方問這個問題。該網站是關於問題,而不是代碼評論。對於代碼評論,有http://codereview.stackexchange.com。 – bennofs

+1

我在問我可能沒有意識到的慣用Haskell。已經有一個被接受和回答的「我應該如何重構這個Haskell ...」的問題,類似於我的問題。如果有幫助,我可以在沒有我的代碼的情況下進行重新配置,標題對於我的問題是自我解釋的。 – itmitica

+0

如果可能的話,分別維護標識符的數字部分,稍後只添加字符串部分。有一個'String - > String'類型的數字增量函數看起來很不愉快。如果你可以用自定義閱讀和顯示的方式將你的號碼包裝在'newtype'中以實現你的最終結果,那就更好了。 (不知道你在用什麼,這就是爲什麼我不確定。) – AndrewC

回答

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 

對所有很好的工作。做得很好。

+0

因此,重複使用負值。好一個。 我真的與你的strInc功能!有一件事我不得不問,爲什麼_作爲第一個測試案例中的尾部? 謝謝! – itmitica

+0

呵呵,所以'_'只是模式匹配中一個unamed變量的符號,'zprefix:znumber:restOfList == zprefix:znumber:_'注意這與'[zprefix,znumber]'略有不同,它會只匹配兩個元素的列表(而不是兩個或更多元素)。 –

+0

我看到,如果我使用多個分隔符,它將只管理第二個元素,並鬆開尾部。順便說一下,如何處理znumber不會轉換爲數字的情況,即znumber = 00001a?謝謝。 – itmitica