haskell中的所有参数都是从左到右阅读的?

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中从右到左构成 因为我的问题对于所有函数都更通用,我也已经知道由其他函数组成的函数被称为函数组合,而我了解点功能等

Ant*_*Xue 6

我想你可能会让事情有些混乱.在您的示例中,复制如下:

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)

应用少于函数参数的参数需要允许您创建稍微"自定义"的新函数.很酷,对吧?:)