我有以下类型的功能:
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
我不确定如何读取上述内容及其背后的含义。
答案 0 :(得分:2)
双::
表明这是Haskell,但所有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))
是函数组合函数。它是一个高阶函数,它将两个函数作为参数。更正式地说,对于任何类型a
,b
和c
,(.)
是来自b
到c
从a
到b
的函数到a
到c
的函数。最后一个函数只是两个参数函数的composition。
您有专门的.
来处理整数。但是,这个想法是一样的。您从Integer -> Integer
和Integer
获取两个函数,应用第一个函数,然后将第二个函数应用于结果。
(.)
或(+)
只是Haskell,“这是一个中缀运算符,但我现在想以前缀形式讨论它。”
因此,Quad
只是来自Integer -> Integer
的函数,它在其参数上调用square,然后在结果上再次调用square。它与
quad x = square (square x)
(haskell区分大小写,函数必须以小写字母开头)