Haskell преобразовывает Int в Float

У меня проблема с одной из функций, в которой я новичок, это функция fromIntegral.

В основном мне нужно взять два аргумента Int и вернуть процент чисел, но когда я запускаю свой код, он продолжает выдавать мне эту ошибку:

Код:

percent :: Int -> Int -> Float
percent x y =   100 * ( a `div` b )
where   a = fromIntegral x :: Float
        b = fromIntegral y :: Float

Ошибка:

No instance for (Integral Float)
arising from a use of `div'
Possible fix: add an instance declaration for (Integral Float)
In the second argument of `(*)', namely `(a `div` b)'
In the expression: 100 * (a `div` b)
In an equation for `percent':
    percent x y
      = 100 * (a `div` b)
      where
          a = fromIntegral x :: Float
          b = fromIntegral y :: Float

Я прочитал прелюдию к Haskell '98, и там говорится, что есть такая функция, вызванная fromInt, но она никогда не работала, поэтому мне пришлось пойти с ней, но она все еще не работает. Помощь!


person Syafiq Kamarul Azman    schedule 24.04.2012    source источник
comment
Я сомневаюсь, что в отчете 98 утверждается, что есть fromInt.   -  person augustss    schedule 24.04.2012


Ответы (1)


Посмотрите на тип div:

div :: Integral a => a -> a -> a

Вы не можете преобразовать свой ввод в Float, а затем использовать div.

Вместо этого используйте (/):

(/) :: Fractional a => a -> a -> a

Следующий код работает:

percent :: Int -> Int -> Float
percent x y =   100 * ( a / b )
  where a = fromIntegral x :: Float
        b = fromIntegral y :: Float
person Nicolas Dudebout    schedule 24.04.2012
comment
Ура, я все время употреблял div и забыл взглянуть на альтернативу! Мои плохие, еще раз спасибо! - person Syafiq Kamarul Azman; 25.04.2012
comment
Для краткости не нужно форсировать тип :: Float - person rotskoff; 25.04.2012
comment
Используя Data.Function.on, вы можете написать percent x y = 100 * ((/) 'on' fromIntegral) x y (заменить 'обратными кавычками) - person Landei; 25.04.2012