2

我有以下类型的函数:

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

我不确定上述内容是如何解读的,以及其背后的含义。

4

1 回答 1

2

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

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

1 :: Integer

构造->函数类型。

timesTwo :: Integer -> Integer

此外,->是右结合。

plus :: Integer -> Integer -> Integer

表示该函数plus接受一个整数并返回一个函数,该函数接受一个整数并返回一个整数。这相当于取两个整数,但在技术上有所不同(从某种意义上说,更简单)。它被称为柯里化。

square :: Integer -> Integer

表示 square 接受一个整数并返回一个整数。

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

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

表示对于任何类型aid 都是从该类型的值到相同类型的另一个值的函数。当使用变量给它一个更通用的类型时,你的.运算符更有意义

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

是函数组合函数。它是一个高阶函数,将两个函数作为参数。更正式地说,对于任何类型a,bc,(.)是从函数 from btoc 到函数from ato到函数from tob 的函数。最终函数只是两个参数函数的组合ac

您专门从事.整数工作。但是,想法是一样的。您从Integer -> Integer和中获取两个函数Integer,应用第一个函数,然后将第二个函数应用于结果。

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

因此,Quad它只是一个函数,Integer -> Integer它在其参数上调用 square,然后在结果上再次调用 square。这将与

quad x = square (square x)

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

于 2013-05-10T09:35:23.003 回答