双重::
表明这是 Haskell,但所有受 ML 启发的语言的一般原则都是相同的(大多数和类型理论约定是使用单一的:
)。
该::
符号表示其左侧具有其右侧的类型。所以
1 :: Integer
构造->
函数类型。
timesTwo :: Integer -> Integer
此外,->
是右结合。
plus :: Integer -> Integer -> Integer
表示该函数plus
接受一个整数并返回一个函数,该函数接受一个整数并返回一个整数。这相当于取两个整数,但在技术上有所不同(从某种意义上说,更简单)。它被称为柯里化。
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
,(.)
是从函数 from b
toc
到函数from a
to到函数from tob
的函数。最终函数只是两个参数函数的组合。a
c
您专门从事.
整数工作。但是,想法是一样的。您从Integer -> Integer
和中获取两个函数Integer
,应用第一个函数,然后将第二个函数应用于结果。
(.)
或者(+)
只是 Haskell,因为“这是一个中缀运算符,但我现在想以前缀形式讨论它。”
因此,Quad
它只是一个函数,Integer -> Integer
它在其参数上调用 square,然后在结果上再次调用 square。这将与
quad x = square (square x)
(haskell 区分大小写,函数必须以小写字母开头)