Haskell:应用翻转两次(翻转翻转类型)

use*_*106 2 haskell functional-programming function

我正在学习Haskell的一些基本功能.我正在用Flip做一些练习,它接受两个参数的函数并评估翻转参数顺序的结果.考虑到翻转功能,我认为,按照翻转的定义,它会翻转参数两次,用原始顺序中的参数评估原始函数.当我用ghci检查函数类型检查这个假设时,它产生了:

翻转翻转:: b - >(a - > b - > c) - > a - > c

我不明白为什么这是翻盖的功能类型.它需要参数b和参数(a - > b - > c)并产生一个函数a - > c.为什么会这样?我真的很感激解释,因为我迷失了这个.提前致谢

Ber*_*rgi 9

翻转两次是\f -> flip (flip f),或flip . flip.这确实有类型(a -> b -> c) -> (a -> b -> c).

你所代替这里做的是应用flip上的flip功能,即翻转flip的参数顺序.所以,如果我们开始

flip :: (a -> b -> c) -> b -> a -> c
-- and, as the type of the argument
flip :: (a' -> b' -> c') -> b' -> a' -> c'
Run Code Online (Sandbox Code Playgroud)

那么如果我们匹配类型

a = (a' -> b' -> c')
b = b'
c = a' -> c'
Run Code Online (Sandbox Code Playgroud)

我们得到了结果

flip flip :: b' -> (a' -> b' -> c') -> (a' -> c')
Run Code Online (Sandbox Code Playgroud)

  • 由于` - >`语法的右关联性.明确地说明,类型是`((a - >(b - >(c))) - >(b - >(a - >(c))))`.Haskell中的所有函数实际上都是一元的(只接受一个参数),它们可能只返回另一个再次接受另一个参数的函数.类型`(b' - >(a' - > c'))`与`((b' - > a') - > c')`不同,它们只是不匹配. (2认同)

Dar*_*nec 6

我们来看看类型:

flip :: (a -> b -> c) -> b -> (a -> c)
flip :: (d            -> e ->  f     ) -> e ->  d            ->  f
flip flip ::                              b -> (a -> b -> c) -> (a -> c)
Run Code Online (Sandbox Code Playgroud)

换句话说,flip反转其参数的前两个参数,前两个参数flip是翻转函数和该函数的第二个参数.因此,不是按照'function','second argument','first argument'的顺序接受参数,而是当你翻转它时,顺序变为'second argument','function','first argument'.

如果你想翻转,然后翻转,你会做这样的事情:

doubleflip x = flip (flip x)
Run Code Online (Sandbox Code Playgroud)

或等效地:

doubleflip = flip . flip
Run Code Online (Sandbox Code Playgroud)

(.)运营商喂右侧的输出到左侧.