如何使用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