簡體   English   中英

字符串操作haskell

[英]String manipulation haskell

在下面的練習中,我想通過使用函數來操作隨機字符串輸入。

第 1 步:我想刪除所有不是數字、字母或空格的字符

第 2 步:我想用“_”替換所有空格

第 3 步:我想將所有數字轉換為空格

第 4 步:我想用 'z' 替換所有的 'a',用 'Z' 替換所有的 'A'

對於列表,我已經使用了 filter 函數,我想知道這個函數是否也可以用於字符串輸入。 我不太確定如何進行這項練習。

更新:我找到了解決第 1 步和第 3 步的方法,但我不太確定如何將不同的函數放在一個包含每個步驟的函數中。 是否可以在某種主函數中以正確的順序一個接一個地調用不同的函數?

    import Data.Char 

    toUpperStr xs = map toUpper xs     -- function to convert lower to upper

    dropInvalids xs = (filter (\x -> isUpper x || isSpace x || isDigit x)) $ 
    toUpperStr xs           

    replaceBlank [] = []               -- function to replace " " with "_"
    replaceBlank (x:xs) =  
             if x == ' ' 
             then '_' : replaceBlank xs 
             else x : replaceBlank xs   

是的,一點沒錯! 這是 Haskell 的優點之一。
您可以將String視為[Char] 事實上,他們就是這樣!
在 GHCi 中,輸入:i String - 你會得到type String = [Char]
您可以輕松地編寫函數。 有一個運算符, (.) 所以(f . g) xf (gx)

我會在幾個關鍵方面改進代碼。
首先,讓replaceBlank函數更通用,所以它需要一個條件和一個替換函數。
其次,將所有函數組合在一個“主”函數中,正如您所說的那樣。
但不要將主函數命名為main 該名稱是為程序的 IO 操作保留的。

不要將最終函數視為“調用”其他函數也很重要。
這是命令式術語,在這里,我們正在應用函數。

另外,為什么你的dropInvalids包含一個toUpperStr 您最終從未將字符串指定為全部大寫。

另外,請務必聲明函數的類型。

在這種情況下,以下將是正確的代碼:

import Data.Char

dropInvalids :: [Char] -> [Char]
dropInvalids = filter (\x -> isLetter x || isSpace x || isDigit x)
    -- isLetter exists

replace' :: (a -> Bool) -> (a -> a) -> [a] -> [a]
replace' _ _ [] = []
replace' f g (x:xs) =
            if f x
            then g x : replace' f g xs
            else x : replace' f g xs
    -- To replace one value with another, use replace (== a) (const b).

replaceWith :: (a -> Bool) -> a -> [a] -> [a]
replaceWith f b = replace' f (const b)

replace :: Eq a => a -> a -> [a] -> [a]
replace a b = replace' (== a) (const b)
  -- The Eq makes sure you can check for equality.

manipulateString :: [Char] -> [Char]
manipulateString = replace 'A' 'Z' . replace 'a' 'z' . replaceWith isDigit ' ' . replace ' ' '_' . dropInvalids

我正在嘗試轉換這樣的字符串(在Haskell中):

[[5,3,,,7,,,,,],[6,,,1,9,5,,,,],[,9,8,,,,,6,],[8,,,,6,,,,3],[4,,8,,3,,,1],[7,,,,2,,,,6],[,6,,,,,2,8,],[,,,4,1,9,,,5],[,,,,8,,,7,9]]

到這樣的列表數組

list =[ [5,3,0,    0,7,0,    0,0,0],
      [6,0,0,    1,9,5,    0,0,0],
      [0,9,8,    0,0,0,    0,6,0],

      [8,0,0,    0,6,0,    0,0,3],
      [4,0,0,    8,0,3,    0,0,1],
      [7,0,0,    0,2,0,    0,0,6],

      [0,6,0,    0,0,0,    2,8,0],
      [0,0,0,    4,1,9,    0,0,5],
      [0,0,0,    0,8,0,    0,7,9]]

有什么建議嗎??

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM