2016-05-23 7 views
0

HaskellのRookie学習再帰関数は、Charsのリストを受け取って同じCharのリストを返す再帰関数toUpperとtoLowerをどのように作成できますか?私はchrとord関数を使って解決しようとしましたが、ordのシグニチャは[Char] - > [Int]ではなくChar - > Intであり、toUpperとtoLowerのものと一致しません。何か案は?Haskellで "ord"関数の署名を変更するにはどうすればよいですか?

+2

あなたの説明に基づいて私は 'map toUpper'または' map toLower'を提案します - しかし、私はあなたの質問が正しいかどうか確信しています – Carsten

+3

* How *これらを使用しますか?彼らは適切に使用される場合、彼らはあなたが必要とするものであるように聞こえる。 –

+0

'map toUpper" hello world "'はあなたに '' HELLO WORLD "'を与えます - これはあなたが話していることですか? – Carsten

答えて

-3

今は気にしないでください。場合には誰もがそれを必要とする:

toUpper::[Char] -> [Char] 
toUpper [] = [] 
toUpper (x:xs) = chr(ord(x)-32):toUpper(xs) 

toLower::[Char] -> [Char] 
toLower [] = [] 
toLower (x:xs) = chr(ord(x)+32):toLower(xs) 
+3

'toUpper" FOO "'や 'toLower" foo "'はどうですか?この問題を別にすれば、すでに用意されているロジック 'map'を再実装するだけです。 'map f [] = []'と '' map f(x:xs)=(f x):(map f xs) 'です。 – chepner

+1

それはそれを行うのはひどい方法です。 – augustss

3

これはmap機能が何をするかを正確です:それは(どんな種類ab用)タイプa -> bの機能を取り、新しい機能[a] -> [b]を返します。

> :t ord 
ord :: Char -> Int 
> :t map ord 
map ord :: [Char] -> [Int] 

これは、あなたがそのUnicodeコードポイントに文字列全体を変換することができます:あなたのアプローチを実装するには、バック

> map ord "foo" 
[102,111,111] 

または

> map chr [102,111,111] 
"foo" 

、あなたはその後、ちょうど適切な関数を定義する必要がありますtoLowertoUpperと一緒に使用する

> map chr (map toLower (map ord "MyStRiNg")) 
mystring 
> map chr (map toUpper (map ord "MyStRiNg")) 
MYSTRING 

(モジュールData.Charは既にtoLower, toUpper :: Char -> Charを提供しています。 )自分の実装を確認するためにそれらを使用することができます。

関連する問題