2012-11-04 48 views
1

修改可能只是將char ascii值加3。 我已經閱讀過幾本書,並且找不到現成的解決方案。 (返回的字符列表可以是不同的列表變量。)如何編寫一個函數來修改一個Char列表並在Haskell中返回?

+3

關於書籍,「學習你一個偉大的好事Haskell!」 (http://learnyouahaskell.com/modules#data-char)是Haskell的一個很好的介紹,並且有一個凱撒代碼的實現(類似於你想要做的)。 – Jerome

+0

簡答:你不能,Haskell列表是不可變的。 – Landei

+0

@蘭代我認爲你誤解了這個問題的意圖。在某些monads中有可變陣列,但是OP沒有提到就地。 – AndrewC

回答

6
import Data.Char 
shiftAscii :: String -> String 
shiftAscii xs = map (chr.(+3).ord) xs 

會做什麼你問。

它可以工作,因爲map使用提供的函數編輯字符串中的每個字符。

ord由3
chr轉換回一CharCharInt
(+3)移位的(ASCII)轉換,

所以chr.(+3).ord是這三個具有功能組合物串成.


爲了更加靈活,你可以寫

shiftAsciiBy :: Int -> String -> String 
shiftAsciiBy n = map (chr.(+ n).ord) 

通知,轉移的ASCII不尊重字母的界限,所以如果你需要這個做rot13編碼或類似的簡單轉變,你會用一個手挽移位功能,只有編輯更好字母

addAscii :: Int -> Char -> Char 
addAscii n c | isUpper c = chr $ ((ord c - ord 'A' + n) `mod` 26) + ord 'A' 
      | isLower c = chr $ ((ord c - ord 'a' + n) `mod` 26) + ord 'a' 
      | otherwise = c 

例如

['A'..'z'] 
"ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz" 

,我們只是轉移字母表ASCII:

map (addAscii 5) ['A'..'z'] 
"FGHIJKLMNOPQRSTUVWXYZABCDE[\\]^_`fghijklmnopqrstuvwxyzabcde" 
+0

剛剛看到一行地圖(+3)a - 這也會增加Int值的技巧,我想, –

+0

在lineAsciiBy n = map(chr。(+ n).ord)--n出現作爲一個Int和一個字符串? ...這是正常的嗎? –

+0

@MikSeljamaa地圖(+3)只適用於數字。 Haskell不會讓你使用Char作爲Int,所以我轉換(ord),添加((+3)),然後轉換回(chr)。實際上n不會顯示爲Int和String,因爲在該行中沒有String! map(chr。(+ n).ord)是一個函數String - > String。這是好的,因爲在Haskell函數中只是數據,所以如果你錯過了最後一個參數,那就需要另一個參數,即一個函數。它被稱爲部分評估:起初很奇怪,但非常有用。它可能已經更清晰地把shiftAsciiBy n xs = map(chr。(+ n).ord)xs – AndrewC

相關問題