Haskellの型間の変換

私はHaskellでテキストの中心にある文字列を返す単純な関数を作成しようとしていますが、どちらの辺を挿入するかを見つけるだけでは問題があります。私はこれを持っている:

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

次のエラーが発生します。

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)

私は(基本的に)Double(私は思う)からIntにどのように変換できますか?

5

2 答え

問題は、DoubleをIntに変換できないということではありません。 round はそれをうまく成し遂げます。つまり、Int( padLength - length string )。エラーメッセージは、Intが分割可能な数値のtypeclassである Fractional のインスタンスではないことを伝えるだけです。

一般に、 fromIntegral(padLength-length string)を使用してDoubleに変換することができますが、この場合は整数除算を直接使うことができます:

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

a `div` b is just a nicer way of writing div a b; you can use any function as a binary operator like this.

9
追加された
私は私の答えにその情報を追加しました:)
追加された 著者 ehird,
なぜそれは `?私はハスケルにとって少し新しい
追加された 著者 Dean Barnes,

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

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

1
追加された