2012-02-07 30 views
0
selectMenu :: Int->IO() 
selectMenu num 
     |(num==2)=convertBinToDecimal 



convertBinToDecimal:: IO() 
convertBinToDecimal= do 
      putStrLn("\n\tConvert Binary To Decimal\n") 
      putStrLn("----------------------------------------------------------\n") 
      putStrLn("Enter 5 binary numbers [,,] : ") 
      input<-getLine 
      let n=(read input)::Int 
      --putStrLn (show n) 
      let result = convertionTO binaryToDec n 
      putStrLn(show result) 

このコードは問題ありませんがエラーがあります。バイナリを10進数に変換

このエラーを解決するソリューションはありますか? はあなたがIntあるxreverseを、使用しようとしている

+2

あなたが 'putStrLn(" Foo ")'を書く方法はちょっと奇妙です。 'f'を' fx'として書いた方がずっと一般的です。あなたの場合、 'putStrLn" Foo "'はもっと自然です。 – gspr

+0

ありがとうございます。私はそれを変更します...ありがとうございました – JJ23

答えて

3

ありがとう(それはあなたがタイプInt -> Intを与えているbinaryToDecの引数、ですので)、それが唯一の作品ようreverseは、タイプ[a] -> [a]を持っていますリスト。

これは、基本的にコンパイラが "reverseの最初の引数に予想される型[a]と実際の型Intを一致させることはできません"と言うときに意味します。エラーメッセージを慎重に読むことをお勧めします。間違ったことを示す手がかりを提供することがよくあります。

この問題を解決するには、何らかの形でxをリストに変換するか、関数を変更してリストを取得します。

+0

これを行う既存の機能を知っていますか?私は 'map digitToInt $ show x'が動作することを知っていますが、ちょっとハックしているようです。 – Pubby

+0

@Pubby:標準ライブラリには何もありません。しかし、Hackageには[digitsパッケージ](http://hackage.haskell.org/packages/archive/digits/0.2/doc/html/Data-Digits.html)があります。 – hammar

1

hammarのように、逆Intとは言えません。あなたの番号を何とかリストに変換する必要があります:: Int -> [Int]

これを行うにはいくつかの不具合があります。

listToNum :: [Int] -> Int 
listToNum = foldl1 ((+) . (*10)) 

numToList :: Int -> [Int] 
numToList n | n <= 9 = [n] 
      | otherwise = numToList (n `div` 10) ++ [n `mod` 10] 

そして、あなたはreverse $ numToList x代わりのreverse xのようにそれを使用することができます。

ちょうどメモ。 selectmenu機能がすべての可能なケースに一致しませんでした。 numが2に等しくない場合はどうなりますか?

+0

ああええ。このプログラムの他の部分は途中です。 (ヒント:まだ書いている) – JJ23

関連する問題