В вашем звонке truncate (sqrt <b>5</b>) + mod <b>5</b> 2
, 5
имеют разные типы.Действительно, 5
в sqrt 5
должно иметь тип Floating a => a
, тогда как 5
в mod 5 2
имеет тип Integral b => b
.Хотя, строго говоря, возможно построить тип в Haskell, который является членом обоих семейств типов, концептуально нечетно , что тип является одновременно Integral
и Floating
, это также будет толькоприменимо к таким типам, что делает его менее полезным.Таким образом, мы могли бы изменить подпись на:
teste :: (Integral a, <b>Floating a</b>, <b>RealFrac a</b>) => a -> a
teste n = truncate (sqrt n) + mod n 2
, но, как уже было сказано, это не очень полезно .
Вы можете использовать fromIntegral :: (Integral a, Num b) => a -> b
здесь для преобразования из типа Integral
в любой тип Num
, например:
teste :: Integral a => a -> a
teste n = truncate (sqrt (<b>fromIntegral</b> n)) + mod n 2
Например:
Prelude> teste 5
3