名前は小文字で始めることはできません。 Show
クラスのshow
がString
を返さなければならない方法
newtype wordInt = WI Int
とあなたのhelper
は(Int
に適用される)タイプInt -> [Int]
があります。ここWordInt
へwordInt
を変更します。あなたは何とかリストに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]
あなたのヘルパー機能はうまくいきます( '\' 'div'では' '' 'の代わりに' ''を使うまでです)、あなたの目標に途中までしか行きません。すなわち、入力をその個々の数字に分解するが、それらを単語に翻訳しない。コンパイラが不平を言う理由です。 –
私はそれをスタックに追加したときにタイプミスでした。私の実際のコードには 'div'がありません。 – Rick
そして、-minInt == minIntを忘れないでください。 – augustss