2011-12-18 11 views
5

ハスケルで中央揃えの文字列を返す単純な関数を作成しようとしていますが、どちらの辺を挿入するかを見つけるだけで問題があります。どのように私は(基本的に)ダブル(と思う)からint型に変換することができますHaskellの型間の変換

No instance for (Fractional Int) 
    arising from a use of '/' 
Possible fix: add an instance declaration for (Fractional Int) 
In the first argument of 'round', namely 
    '((padLength - (length string))/2)' 
In the expression: round ((padLength - (length string))/2) 
In an equation for `center': 
    center padLength string = round ((padLength - (length string))/2) 

center padLength string = round ((padLength - (length string))/2) 

次のエラーを与える:私はこれを持っていますか?

答えて

9

ダブルをIntに変換できないという問題はありません。roundはこれをうまく実行します。つまり、Int(padLength - length string)で除算しようとしています。このエラーメッセージは、Intが、分割可能な数値のtypeclassであるFractionalのインスタンスではないことを伝えています。

一般的には、あなたが二重にそれを回すためにfromIntegral (padLength - length string)を使用することができますが、この場合には、あなたは、単に直接整数の除算を使用することができます。

center padLength string = padLength - (length string) `div` 2 

a `div` bdiv a bを書くだけのよりよい方法です。このような関数をバイナリ演算子として使うことができます。

+0

なぜ?私は少しハスケルに新しいです –

+1

私は私の答えにその情報を追加しました:) – ehird

1

整数型のオペランドに小数点以下の除算/を使用しようとしていますが、これは定義されていません。

fromIntegralを使用して)分割する前にオペランドをDoubleに変換するか、または整数除算divを使用する必要があります。