我陷入了一个非常简单的练习,我只需使用 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
有人可以解释一下或给出一篇文章来解释(Integral b,Floating b,Num a)
部分。我所知道的是 Num a => a "1"-> a "2"-> a "3"
对于 f x y = x + y
x
的类型为 a1
,y
的类型为 a2
,解为 a3
所有类型类 Num
用于 (*), (+), (^), ...
。
最佳答案
(^) :: (Num a, Integral b) => a -> b -> a
采用 Integral 类型作为第二个参数。整数类型类似于 Int
、Integer
等。
但是你的sqrt :: Floating f => f -> f
接受一个Floating
值并返回一个Floating
值。这意味着 z
的类型必须是 Integral
和 Floating
类型类的成员。尽管严格来说,可以实现此类类型,但是这两个类型类在哪些类型可以成为成员方面相互矛盾。
您可能应该使用 (**) :: Floating f => f -> f -> f
在这里将数字提高到 float 幂。因此,我们可以将 f
定义为:
f x y z = x + y <b>**</b> sqrt z
然后 f
的类型为:
f :: Floating a => a -> a -> a -> a
因此,它需要三个 a
,其中 a
是 Floating
类型类成员的类型,并返回一个 一个
。
关于haskell - 如何在 Haskell 中使用 let 声明函数(仅限单行操作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58078421/