use*_*106 2 haskell functional-programming function
我正在学习Haskell的一些基本功能.我正在用Flip做一些练习,它接受两个参数的函数并评估翻转参数顺序的结果.考虑到翻转功能,我认为,按照翻转的定义,它会翻转参数两次,用原始顺序中的参数评估原始函数.当我用ghci检查函数类型检查这个假设时,它产生了:
翻转翻转:: b - >(a - > b - > c) - > a - > c
我不明白为什么这是翻盖的功能类型.它需要参数b和参数(a - > b - > c)并产生一个函数a - > c.为什么会这样?我真的很感激解释,因为我迷失了这个.提前致谢
翻转两次是\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)
我们来看看类型:
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)
该(.)运营商喂右侧的输出到左侧.