Aug*_*son 0 haskell functional-programming
例如:
f :: (b -> c) -> (a -> b) -> c
g h
Run Code Online (Sandbox Code Playgroud)
函数f将两个函数(我们称之为g和h)作为输入参数,并返回一个c类型的值
第一个参数:(a -> b)
第二个参数:(b -> c)
返回:类型的值c
为了使此函数定义为真,类型必须排列,如下所示:(a -> b) -> (b -> c)<=等效于=>a -> c
并且唯一的方法是将第二个参数用作第一个参数的输入,例如g(h(x)),其中x是a类型,对于Haskell中的所有函数都是如此?换句话说,正确的参数总是被定义为其左参数的输入?这是Haskell中所有组合函数的一般情况吗?如果是这样,我应该始终从右到左而不是从左到右阅读和解释函数参数?
OBS:这个问题与以下问题不同: 为什么点在haskell中从右到左构成 因为我的问题对于所有函数都更通用,我也已经知道由其他函数组成的函数被称为函数组合,而我了解点功能等
我想你可能会让事情有些混乱.在您的示例中,复制如下:
f :: (b -> c) -> (a -> b) -> c
Run Code Online (Sandbox Code Playgroud)
这f是一个更高阶的函数,这意味着它可以将其他函数作为参数.事实上,它的第一个参数是类型的函数(b -> c).它的第二个参数是类型的函数(a -> b).
函数的参数根本不必彼此相关.在你的情况下,这只是一个巧合.我们可以很容易地完成这样的事情:
g :: (Int -> Double) -> (Char -> Bool) -> String
g func1 func2 = "three"
Run Code Online (Sandbox Code Playgroud)
另一件需要注意的事情是Haskell中的所有函数都是curry.回想一下像C这样的语言:
char foo (int a, double b) { ... }
Run Code Online (Sandbox Code Playgroud)
该函数接受(int, double)并返回一个char.我们甚至可以像这样写出它的类型签名:
(int, double) -> char
Run Code Online (Sandbox Code Playgroud)
在Haskell中,我们不需要立即输入所有参数,它表示为:
int -> double -> char
Run Code Online (Sandbox Code Playgroud)
为什么世界上你想要这个?请考虑以下情形:
add :: Int -> Int -> Int
add a b = a + b
Run Code Online (Sandbox Code Playgroud)
看一下这个:
addFive :: Int -> Int
addFive = add 5
Run Code Online (Sandbox Code Playgroud)
应用少于函数参数的参数需要允许您创建稍微"自定义"的新函数.很酷,对吧?:)