繁体   English   中英

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

[英]Haskell: applying flip twice (type of flip flip)

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

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

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

翻转两次将是\\f -> flip (flip f)flip . flip 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'

那么如果我们匹配类型

a = (a' -> b' -> c')
b = b'
c = a' -> c'

我们得到了结果

flip flip :: b' -> (a' -> b' -> c') -> (a' -> c')

我们来看看类型:

flip :: (a -> b -> c) -> b -> (a -> c)
flip :: (d            -> e ->  f     ) -> e ->  d            ->  f
flip flip ::                              b -> (a -> b -> c) -> (a -> c)

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

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

doubleflip x = flip (flip x)

或等效地:

doubleflip = flip . flip

(.)运算符将右侧的输出馈送到左侧。

应用flip功能两次。 如果你想要flip两次,你正在寻找:

flip . flip :: (b -> a -> c) -> b -> a -> c

你在这里做的是翻转 flip功能。 所以它需要flip才能flip

我们可以解决flip 1 flip 2的类型(我这里使用下标来明确我们所指的flip ):

flip1 :: (a -> b -> c) -> b -> a -> c
flip2 :: (d -> e -> f) -> e -> d -> f

由于flip 2flip 1的参数,因此这意味着flip 2的类型与flip 1的参数类型相同,因此这意味着:

        a       -> (b ->    c    )
~ (d -> e -> f) -> (e -> (d -> f))

因此,这意味着a ~ (d -> e -> f) (类型ad -> e -> f ), b ~ ec ~ (d -> e) 所以函数flip 1 flip 2的类型是flip 1的输出类型的类型,但是具有等价,所以这意味着:

flip1 flip2 :: b -> a -> c
flip1 flip2 :: e -> (d -> e -> f) -> (d -> e)

我们基本上创建了一个函数,首先获取第二个参数,然后获取函数,然后是第一个参数,然后使用翻转的参数调用该函数。 因此,如果flip2 = flip flip ,它实现如下:

flip2 :: e -> (d -> e -> f) -> (d -> e)
flip2 y f x = f x y

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM