双重::表明这是 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,b和c,(.)是从函数 from btoc 到函数from ato到函数from tob 的函数。最终函数只是两个参数函数的组合。ac
您专门从事.整数工作。但是,想法是一样的。您从Integer -> Integer和中获取两个函数Integer,应用第一个函数,然后将第二个函数应用于结果。
(.)或者(+)只是 Haskell,因为“这是一个中缀运算符,但我现在想以前缀形式讨论它。”
因此,Quad它只是一个函数,Integer -> Integer它在其参数上调用 square,然后在结果上再次调用 square。这将与
quad x = square (square x)
(haskell 区分大小写,函数必须以小写字母开头)