Hello, today is a Nice Day!!
私の質問は、 「スペースと句読点を取り除き、大文字を小文字に置き換えるにはどうすればよいですか?」などを含む文字列を入れるかどうかです。
それらを削除する方法は知っていますが、それらを置き換える方法はわかりません。
また、句読点を取り除くために。
申し訳ありませんが、文字列をいじる方法がわかりません。数字だけです。
testList xs = [if x = [,|.|?|!] then " " | x<-xs]
Hello, today is a Nice Day!!
私の質問は、 「スペースと句読点を取り除き、大文字を小文字に置き換えるにはどうすればよいですか?」などを含む文字列を入れるかどうかです。
それらを削除する方法は知っていますが、それらを置き換える方法はわかりません。
また、句読点を取り除くために。
申し訳ありませんが、文字列をいじる方法がわかりません。数字だけです。
testList xs = [if x = [,|.|?|!] then " " | x<-xs]
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
必要な機能は次の場所にありますData.Char
。
import Data.Char
process str = [toLower c | c <- str , isAlpha c]
個人的には、関数構成アプローチの方が明確だと思います。
process = map toLower . filter isAlpha
私は長い間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
いますが、自分で書きたい場合は、こちらのスタックオーバーフローを確認してください。その質問は以前にもありました。
句読点を取り除くには、このようなフィルターを使用できます
[x | x<-[1..10], x `mod` 2 == 0]
使用している「if」はフィルタリングされません。リスト内包表記の「マップ」部分に if を入れると、2 つのオプションから選択するだけで済みますが、それらを除外することはできません。
物事を小文字に変換することに関しては、すでに数字でやってのけることができるのと同じトリックです:
[x*2 | x <- [1..10]]
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"