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

时间:2016-01-24 10:53:45

标签: haskell

如果我强迫Haskell推断出一个数字的类型,我会得到map。例如:

load()

Num a => a是什么意思?

4 个答案:

答案 0 :(得分:11)

1 :: Num a => a表示1有一些类型a,其中aNum类型类的实例。请注意,Num不是类型,而是类型类,它描述了各种类型的常见属性。例如,Num类型类描述了数字类型,因此支持基本算术。本机计算机整数类型IntNum的实例,任意大小的Integer,浮点类型Double,甚至是有理数类型{{ 1}}。

答案 1 :(得分:7)

a => a并不意味着什么。完整的短语是Num a => a。这意味着" a"是Num类型类的实例。

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

请注意->=>之间存在差异。第一个用于功能签名;第二个用于显示类型类。

答案 2 :(得分:3)

对于类型1 :: Num a => a中的所有类型1,键入a表示“a类型为Num”。更为简洁,这意味着“1具有任何数字类型”。

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

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

答案 3 :(得分:0)

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

让我们一步一步构建:

1 :: 表示 1 的类型为

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

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

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