2016-10-15 4 views
2

に文字列にint型に変換しようとしています。例:入力が4321の場合、出力は4,330です。 このため、私は最初に入力を個々の数字に分割したいと思います。 exの入力4321は[4,3,2,1]の配列になります。は、私はその言葉の整数整数と出力を取り込むためのコードを記述しようとしていますハスケル

瞬間に私の現在のコード

newtype wordInt = WI Int 

instance Show WordInt where 
    show (WI x) | x>= 0 = helper x 
       | x < 0 = helper -x 

helper 0 = [0] 
helper x = x `mod` 10 : helper (x `div` 10) 

は、私は私がタイプのエラーを取得していると思います。 これは、正数と負数の両方を渡すことができる必要があることに注意してください。また、私が探しているコンバージョンを効率的に行う方法について考えることができれば、大変感謝しています。種類の

+0

あなたのヘルパー機能はうまくいきます( '\' 'div'では' '' 'の代わりに' ''を使うまでです)、あなたの目標に途中までしか行きません。すなわち、入力をその個々の数字に分解するが、それらを単語に翻訳しない。コンパイラが不平を言う理由です。 –

+0

私はそれをスタックに追加したときにタイプミスでした。私の実際のコードには 'div'がありません。 – Rick

+0

そして、-minInt == minIntを忘れないでください。 – augustss

答えて

2

名前は小文字で始めることはできません。 ShowクラスのshowStringを返さなければならない方法

newtype wordInt = WI Int 

とあなたのhelperは(Intに適用される)タイプInt -> [Int]があります。ここWordIntwordIntを変更します。あなたは何とかリストにshowを呼び出すことにより、例えば、Stringにリストを変換する必要があります。

最後に
instance Show WordInt where 
    show (WI x) | x >= 0 = show $ helper x 
       | x < 0 = show $ helper (-x) 

、私は括弧で-xを入れ予告。そうでない場合、コンパイラはあなたが(機能はないIntです)helperからxを引くしようとしていると思われますので、これは単項マイナスのために必要とされています。それが逆に数字のリストを返すため

しかし、helperの実装が間違っています。これを修正するには、数字を分割して、リストを逆にするヘルパー関数を書くことができます:

helper :: Int -> [Int] 
helper = reverse . go 
    where go 0 = [0] 
      go x = x `mod` 10 : go (x `div` 10) 

しかし、この意志パッドは、先行ゼロ数:

λ. helper 4321 
[0,4,3,2,1] 

これはしていませんもちろん、意味を変え、それが問題であるならば、このような場合に対処するためのラッパー関数を記述します。

helper :: Int -> [Int] 
helper x = 
    case splitIntoDigits x of 
     [] -> [0] 
     xs -> reverse xs 

splitIntoDigits :: Int -> [Int] 
splitIntoDigits 0 = [] 
splitIntoDigits x = x `mod` 10 : splitIntoDigits (x `div` 10) 

それは、両方のケースで動作します。

λ. helper 0 
[0] 
λ. helper 4321 
[4,3,2,1] 
+0

私はちょうどあなたの 'helper'実装が(間違った答えを与えるという意味で)あまりにも間違っていることに気づきました。私はすぐに私の答えを更新します。 – dkasak

+0

リストを逆にした方が良いのではないでしょうか?先に考えると、10進数の前の1桁を処理してテキストに変換する方が簡単でしょうか? – Rick

+0

「リストを逆にする」とはどういう意味ですか?これを最初に逆にすることを意味するなら、これは可能です(追加するには '(++)'を使いますが)小さい方から大きい方へ(右から左へ)数値を処理すると非効率です。あなたの2番目の質問に関して、あなたはすでに10桁の数字の前に1桁の数字を処理しています。左から右へ番号を処理すると言ったのですか? – dkasak

関連する問題