2013-10-31 51 views
0

我需要使用Data.Char中的函數才能創建一個名爲camelcaser的函數,它的功能類似於:大寫字母和小寫字母在模式中的每個字母上→下→上→下。Haskell字符串中的交替外殼

我試圖用lexLitChar來拉出一個元素然後大寫它,跳過下一個元素,直到整個字符串完成。我也覺得這可以通過遞歸來完成,但類型轉換似乎太困難了。

我要做的事情:String -> [(char,string)] -> [char,(char,string)] -> [char] -> String

camelcaser str = foldr f "" str 
    where f x y   = (LexLit x) ++ y 
      LexLit x  = Uppercase (lexlitChar x) 
      Uppercase (y,z) = toUpper y 

我種難倒我這個要去的地方,任何人都關心指導我在正確的道路?

+0

你知道你不能給出以大寫字母開頭的函數名稱嗎? – jwodder

+0

函數應該如何處理輸入字符串中的非字母? – jwodder

回答

6

那麼,如果生成的字符串應該在大寫字母&之間交替,那麼您可以一次取兩個字符串中的字符:第一個字符大寫,第二個小寫字母小寫,然後取下一對。例如:

camelcaser (a:b:str) = toUpper a : toLower b : camelcaser str 

你仍然需要制定出如何處理少於兩個字符的字符串,但應該是容易的,這個答案已經通過了基本的輕推暗示,我希望它是。

0

這是另一種可能性。也許你可以有一些樂趣,試圖找出它的工作原理。

camelCaser = map (\(i,c) -> if even i then toUpper c else toLower c) . zip [0..] 
+0

爲了進一步打高爾夫,'zipWith($)(cycle [toUpper,toLower])' – Squidly