如何读取类型系统的语法?

时间:2013-04-19 12:43:02

标签: haskell semantics type-systems

我有以下类型的功能:

Quad = square · square
Square :: Integer -> Integer (So this function takes an integer as an input and outputs an integer)

The operator · is used in the definition of quad with type:

(·) :: (Integer -> Integer) -> (Integer -> Integer) -> Integer -> Integer

我不确定如何读取上述内容及其背后的含义。

1 个答案:

答案 0 :(得分:2)

::表明这是H​​askell,但所有ML启发语言的一般原则是相同的(大多数,类型理论约定,是使用单:)。

::符号表示其左侧具有右侧的类型。所以

1 :: Integer

->构造一个函数类型。

timesTwo :: Integer -> Integer

此外,->是正确关联的。

plus :: Integer -> Integer -> Integer

表示函数plus取一个整数并返回一个函数,它接受一个整数并返回一个整数。这相当于采用两个整数,但在技术上是不同的(在某种意义上,更简单)。它被称为currying。

square :: Integer -> Integer

表示square取整数并返回一个整数。

通常,在类型理论和函数式编程语言中,我们使用类型变量,所以

id :: forall a. a -> a
id x = x

表示任何类型a id的是从该类型的值到相同类型的另一个值的函数。使用变量

给出更通用的类型时,.运算符更有意义

(·) :: (b -> c) -> (a -> b) -> a -> c
f . g x = f (g (x))

是函数组合函数。它是一个高阶函数,它将两个函数作为参数。更正式地说,对于任何类型abc(.)是来自bc ab 的函数ac的函数。最后一个函数只是两个参数函数的composition

您有专门的.来处理整数。但是,这个想法是一样的。您从Integer -> IntegerInteger获取两个函数,应用第一个函数,然后将第二个函数应用于结果。

(.)(+)只是Haskell,“这是一个中缀运算符,但我现在想以前缀形式讨论它。”

因此,Quad只是来自Integer -> Integer的函数,它在其参数上调用square,然后在结果上再次调用square。它与

相同
quad x = square (square x)

(haskell区分大小写,函数必须以小写字母开头)