haskell - 如何在 Haskell 中使用 let 声明函数(仅限单行操作)

标签 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

有人可以解释一下或给出一篇文章来解释(Integral b,Floating b,Num a)部分。我所知道的是 Num a => a "1"-> a "2"-> a "3" 对于 f x y = x + y

x 的类型为 a1y 的类型为 a2,解为 a3 所有类型类 Num 用于 (*), (+), (^), ...

最佳答案

(^) :: (Num a, Integral b) => a -> b -> a采用 Integral 类型作为第二个参数。整数类型类似于 IntInteger 等。

但是你的sqrt :: Floating f => f -> f接受一个Floating值并返回一个Floating值。这意味着 z 的类型必须是 IntegralFloating 类型类的成员。尽管严格来说,可以实现此类类型,但是这两个类型类在哪些类型可以成为成员方面相互矛盾。

您可能应该使用 (**) :: 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,其中 aFloating 类型类成员的类型,并返回一个 一个

关于haskell - 如何在 Haskell 中使用 let 声明函数(仅限单行操作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58078421/

相关文章:

haskell - Haskell 中是否有从 XSD 生成 XML picklers 的工具?

haskell - 由于柯里化(Currying),arity-n 的函数真的只是一个 n 类吗?可以做成 1 类吗?

haskell - 我们可以在 Hindley Milner 类型系统的构造函数位置有类型变量吗?

haskell - 我可以表达一个子类约束吗?

haskell - 如何使用 System.Cron.Schedule 处理长时间运行的作业?

c - Haskell 到 C - 自定义数据类型

javascript - Haskell 中的应用运算符

haskell - 如何在haskell中重新导出单个实体

空集上的 Haskell 模式匹配

haskell - 使 Haskell 函数无点