2016-12-15 7 views
0

現在、文字列内の文字数と桁数をカウントするメソッドを実装しようとしています。しかし、 '\'文字を含む文字列を使用すると、私は奇妙な結果を得ています。バックスラッシュ文字はエスケープ文字なので、私はそれを推測しています。ここで文字列変更出力のバックスラッシュ

はメソッドです:

"1234fd" - > 6( '\' は含まれません)

:ここ

import Data.Char 

countLettersAndDigits :: String -> Int 
countLettersAndDigits [] = 0 
countLettersAndDigits (x:xs) = if isDigit x == True || isLetter x == True 
           then 1 + countLettersAndDigits xs 
           else countLettersAndDigits xs 

は、それぞれの結果を入力のセットです

"1234fの\ dの" - "FD \ 1234" の文字 に文字列/文字リテラルで>字句エラー 'D'

- > 5

"123 \ 4FD" - > 5

"12 \ 34fd" - > 4

"1 \ 234fd" - > 4

"\ 1234fd" - > 3

たとえば、 "1234 \ fd"と "123 \ 4fd"の両方が結果として5を返すのは奇妙なことです。

この問題の原因とその回避方法については、素晴らしいことだ!

乾杯。

編集

私が上記使用される文字列は、私が遊んでいただけの例であったことを言及するのを忘れてしまいました。問題の原因となっている実際の文字列は、クイックチェックによって生成されています。文字列は "¥178"でした。だから私は自分のコードで、バックスラッシュが1つだけで、文字列が私のために生成されているときに、このケースを処理できる方法が必要です。乾杯。

+1

文字列 '' \ 178 "'は、 'show'や' print'(基本的に引用符が付いている場合)の出力として見れば、実際は印刷可能ではない1文字です。例えば ​​'map Data.Char.ord" \ 178 "を見てください。これは文字コードのリストを提供します。引用符が付いていない場合は、おそらく4文字です。あなたがコードをエスケープするのに慣れていないなら、少し微妙です。 – luqui

+0

あなたはクイックチェックで問題があると言います。あなたが使用しているquickcheckプロパティは何ですか?おそらくそこに無効な仮定がありますか? – luqui

+0

私はハスケルを新しくしており、速度を上げるためにコード戦争を使用しています。残念ながら私のコードを実行しているときにエラーを投げていたので、もう詳細を与えることはできません。私はエスケープコードを調べて、もっと素早く確認します。迅速な対応に感謝します。 – pls

答えて

3

\はHaskellのエスケープ文字です。あなたが生成された文字列を印刷した場合、答えはより明白である可能性があります

main = mapM_ putStrLn [ "1234fd" 
         , "1234\fd" 
         , "123\4fd" 
         , "12\34fd" 
         , "1\234fd" 
         , "\1234fd" 
         ] 

利回り...

1234fd 
1234d 
123fd 
12"fd 
1êfd 
Ӓfd 

あなたが実際にあなたの文字列内のバックスラッシュ文字を含むに意図した場合、あなたが倍増する必要がありますそれ:"\\"は単一の\が印刷されるでしょう。

read up on escape sequences hereです。

+2

最終的な効果として彼が望むものであれば、バックスラッシュを実際にどのように含めるかについて言及する価値があるかもしれません。 –

+0

@ダニエルワグナー - 良い点。私は答えを更新しました。 –

+0

@ChadGilbert答えをありがとう。なぜこれらの数字が生成されているのかを明確にしてください。私はちょうど私の質問に編集を追加しました。私が抱えている問題は、文字列がクイックチェックによって生成されているときです。 – pls

関連する問題