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