6

Hello, today is a Nice Day!!私の質問は、 「スペースと句読点を取り除き、大文字を小文字に置き換えるにはどうすればよいですか?」などを含む文字列を入れるかどうかです。

それらを削除する方法は知っていますが、それらを置き換える方法はわかりません。

また、句読点を取り除くために。

申し訳ありませんが、文字列をいじる方法がわかりません。数字だけです。

testList xs = [if x = [,|.|?|!] then " "  | x<-xs] 
4

6 に答える 6

7
import Data.Char

句読点をスペースに変換し、文字を大文字から小文字に変換する場合:

testList xs = [if x `elem` ",.?!" then ' ' else toLower x | x<-xs]

例:testList "TeST,LiST!" == "test list "

句読点を削除して文字を大文字から小文字に変換する場合:

testList2 xs = [toLower x | x<-xs, not (x `elem` ",.?!")]

例:testList2 "Te..S,!t LiS?T" == "test list"

Data.Char をインポートしたくない、またはインポートできない場合、これは toLower の実装です。

toLower' :: Char -> Char
toLower' char 
    | isNotUppercase = char -- no change required
    | otherwise = toEnum (codeChar + diffLowerUpperChar) -- char lowered
    where
      codeChar = fromEnum char -- each character has a numeric code
      code_A = 65
      code_Z = 90
      code_a = 97
      isNotUppercase = codeChar < code_A || codeChar > code_Z
      diffLowerUpperChar = code_a - code_A
于 2013-03-10T08:28:03.163 に答える
4

必要な機能は次の場所にありますData.Char

import Data.Char

process str = [toLower c | c <- str , isAlpha c]

個人的には、関数構成アプローチの方が明確だと思います。

process = map toLower . filter isAlpha
于 2013-03-10T05:27:20.290 に答える
4

私は長い間Haskellでコードを書いていませんでしたが、次のようにして無効な文字を削除し(スペースに置き換えます)、文字を大文字から小文字に変換する必要があります。

import Data.Char

replace invalid xs = [if elem x invalid then ' ' else toLower x | x <- xs]

同じことを行う別の方法:

repl invalid [] = []
repl invalid (x:xs) | elem x invalid = ' ' : repl invalid xs
                    | otherwise      = toLower x : repl invalid xs

replace次のように(またはrepl) 関数を呼び出すことができます。

replace ",.?!" "Hello, today is a Nice Day!!"

上記のコードは以下を返します。

"hello  today is a nice day  "

編集:私はHaskellのtoLower関数を使用してData.Charいますが、自分で書きたい場合は、こちらのスタックオーバーフローを確認してください。その質問は以前にもありました。

于 2013-03-10T04:16:55.367 に答える
2

句読点を取り除くには、このようなフィルターを使用できます

[x | x<-[1..10], x `mod` 2 == 0]

使用している「if」はフィルタリングされません。リスト内包表記の「マップ」部分に if を入れると、2 つのオプションから選択するだけで済みますが、それらを除外することはできません。

物事を小文字に変換することに関しては、すでに数字でやってのけることができるのと同じトリックです:

[x*2 | x <- [1..10]]
于 2013-03-10T04:04:43.163 に答える
0

fromEnum と toEnum を使用して許可する文字を選択する、モジュールをインポートしないバージョンを次に示します。

testList xs = 
  filter (\x -> elem (fromEnum x) ([97..122] ++ [32] ++ [48..57])) $ map toLower' xs 
    where toLower' x = if elem (fromEnum x) [65..90] 
                          then toEnum (fromEnum x + 32)::Char 
                          else x

OUTPUT:
*Main> testList "Hello, today is a Nice Day!!"
"hello today is a nice day"

モジュールのない置換関数の場合、次のようなものが機能する可能性があります。

myReplace toReplace xs = map myReplace' xs where
  myReplace' x
    | elem (fromEnum x) [65..90] = toEnum (fromEnum x + 32)::Char
    | elem x toReplace           = ' '
    | otherwise                  = x

OUTPUT:
*Main> myReplace "!," "Hello, today is a Nice Day!! 123"
"hello  today is a nice day   123"
于 2013-03-10T04:37:37.673 に答える