繁体   English   中英

在 Haskell 类型系统中,`Num a => a` 是什么意思?

[英]What does `Num a => a` mean in Haskell type system?

如果我强制 Haskell 推断数字的类型,我会得到Num a => a 例如:

Prelude> :t 1
1 :: Num a => a

但是a => a是什么意思?

1:: Num a => a表示1具有某种类型a ,其中aNum类型类的一个实例。 注意Num不是类型,而是类型类,它描述了各种类型的公共属性。 例如, Num类型类描述了数字类型,因此支持基本算术。 本机整数类型IntNum的实例,任意大小的Integer 、浮点类型Double甚至有理数类型Rational也是。

a => a没有任何意义。 完整的短语是Num a => a 这意味着“a”是Num类型类的一个实例。

您也可以将其读作(Num a) => a 它提供了一个上下文来说明a是数字。
但是,它不是a类型 它只是说a应该在Num类型中。
类型类有点像面向对象编程中的接口,因为它们定义a某些行为,但没有详细定义。

请注意->=>之间是有区别的。 第一个用于函数签名; 第二个用于显示类型类。

输入1:: Num a => a意味着“ 1是类型a ,对于类型类Num中的所有类型a ”。 更简洁地说,它意味着“ 1是任何数字类型”。

由于这种类型,您可以将1传递给任何需要任何数字类型的函数,例如IntDouble等。

稍微扩展您的示例,我们还有[1,2,3]:: Num a => [a] 这意味着“ [1,2,3]是类型a的值列表,对于类型类Num中的所有类型a ”。 换句话说,“ [1,2,3]是任何数字类型的值列表”。

表达式1::Num a => a可以分解为 3 个部分以便于阅读/理解。

让我们一步步构建:

1::表示1 的类型为

c:: Char表示c 的类型为 Char

=> 之前的所有内容都是“类约束” ,因此在 :: 和 => 之间插入Num a

1:: Num a => a表示“1 具有a的类型,但不仅是任何类型,而且具有类约束,其中a是 Num 类的成员。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM