Haskell 将浮点转换为整数

Haskell 将浮点转换为整数,haskell,Haskell,我试图定义: square :: Integer -> Integer square = round . (** 2) 我得到: <interactive>:9:9: error: • No instance for (RealFrac Integer) arising from a use of ‘round’ • In the first argument of ‘(.)’, namely ‘round’ In the expression:

我试图定义:

square :: Integer -> Integer 
square = round . (** 2)
我得到:

<interactive>:9:9: error:
    • No instance for (RealFrac Integer) arising from a use of ‘round’
    • In the first argument of ‘(.)’, namely ‘round’
      In the expression: round . (** 2)
      In an equation for ‘square’: square = round . (** 2)

<interactive>:9:18: error:
    • No instance for (Floating Integer)
        arising from an operator section
    • In the second argument of ‘(.)’, namely ‘(** 2)’
      In the expression: round . (** 2)
      In an equation for ‘square’: square = round . (** 2)
:9:9:错误:
•没有因使用“舍入”而产生的(RealFrac Integer)实例
•在“(.”的第一个参数中,即“round”
在表达式中:圆形。(** 2)
在“正方形”的方程式中:正方形=圆形。(** 2)
:9:18:错误:
•没有(浮点整数)的实例
由操作员部分产生
•在“(.”的第二个参数中,即“(**2)”
在表达式中:圆形。(** 2)
在“正方形”的方程式中:正方形=圆形。(** 2)

我对这种语言还是新手,似乎无法将浮点实例转换为整数。有人知道我该怎么做吗?

Haskell有多种不同类型的指数函数:

你要找的就是
(^)
。有了它,您甚至不需要

square :: Integer -> Integer 
square = (^ 2)

这是Alec答案的附录,它是正确的,可以帮助您理解错误消息。
(**)
的类型为

(**) :: (Floating a) => a -> a -> a
所以

(因为文本
2
可以是我们需要的任何数字类型)。但是
a
Integer
,因为函数声明将
整数作为输入。所以现在

(** 2) :: Integer -> Integer  --provided that there is a `Floating Integer` instance
这就解释了您的第二个错误,因为没有
Integer
实例--
Integer
不支持像
sin
这样的浮点运算(以及用任意实数求幂)

然后将此函数的输出(一个
整数
)传递给具有类型的
舍入

round :: (RealFrac a, Integral b) => a -> b
我们知道输入
a
,是
Integer
,因为它来自我们讨论过的
(**2)
,而输出
b
也是
Integer
,因为函数的输出被声明为
Integer
。现在你有了

round :: Integer -> Integer  
    --provided there are `Integral Integer` and `RealFrac Integer` instaces

有一个
Integer
实例,因此使用它,但没有
Integer
实例,这解释了您的第一个错误
Integer
s不支持提取分子等类似有理数的操作(尽管我认为它们可以…。

作为@luqui答案的附录,如果您想修复错误(而不是仅仅遵循@Alec的优秀解决方案),您可以先将
Integer
参数转换为
Floating
实例:

square :: Integer -> Integer 
square = round . (** 2) . fromInteger

卢基的回答是否可以浓缩为对亚历克回答的评论仍有争议,但这肯定是对卢基回答的评论。
square :: Integer -> Integer 
square = round . (** 2) . fromInteger