如何使用let在Haskell中声明函数(仅限单行运算符)
我被困在一个非常简单的练习后面,我只需要用如何使用let在Haskell中声明函数(仅限单行运算符),haskell,Haskell,我被困在一个非常简单的练习后面,我只需要用let做x+y^sqrt z,但我尝试了: let f x y z = x + y ^ sqrt z 但它不起作用,当使用f时,它会抱怨类型未匹配,并且使用:t(f)时,我得到: (f) :: (Integral b, Floating b, Num a) => a -> a -> b -> a 有人能解释一下或给出一篇文章来解释(整数b,浮点b,数值a)部分吗。我知道的是numa=>a“1”->a“2”->a“3” 对于f
let
做x+y^sqrt z
,但我尝试了:
let f x y z = x + y ^ sqrt z
但它不起作用,当使用f
时,它会抱怨类型未匹配,并且使用:t(f)
时,我得到:
(f) :: (Integral b, Floating b, Num a) => a -> a -> b -> a
有人能解释一下或给出一篇文章来解释(整数b,浮点b,数值a)
部分吗。我知道的是numa=>a“1”->a“2”->a“3”
对于f x y=x+y
x
的类型为a1
,y
的类型为a2
,解决方案为a3
所有类型的Num
,用于(*)、(+)、(^),…
将积分类型作为第二个参数。整数类型类似于Int
,Integer
等
但是,您将获取一个浮点
值并返回一个浮点
值。因此,这意味着z
的类型需要同时是Integral
和Floating
typeclass的成员。虽然严格地说,实现这样的类型是可能的,但这两个类型类在什么类型可以成为成员方面相互矛盾
您可能应该使用此处将数字提升为浮点数。因此,我们可以将f
定义为:
f x y z = x + y ** sqrt z
因此,它需要三个a
s,其中a
是Floating
typeclass的成员类型,并返回a,(整数b,浮点b,Num a)
位是typeclass约束。请查看并获取一些信息。另一件事-Haskell中有,我想你想要**
而不是^
。问题是^
操作符需要一个整数作为它的第二个输入(即,你可以写2^3
,但你不能写2^3.0
)。但是,sqrt
函数返回一个浮点数。如果要将数字提升为浮点幂,则必须使用**
运算符。例如,可以编写2**3.0
。因此,您的函数将是让fxyz=x+y**sqrt z
。大多数数字既不是整数
,也不是浮点
。
f :: Floating a => a -> a -> a -> a