你的第二个假设是错误的:
翻转的第二个参数,x 是 t1 类型,因为 f 函数中的参数 t1。
我们先来分析一下函数:
flip f x y = f y x
我们看到flip
头脑中有三个参数。所以我们首先制作类型:
flip :: a -> (b -> (c -> d))
当然,我们现在的目标是填写类型。和:
f :: a
x :: b
y :: c
flip f x y :: d
我们在右手边看到:
(f y) x
所以这意味着这f
是一个作为 input 的函数y
。所以这意味着它与(或更短)a
类型相同。c -> e
a ~ c -> e
所以现在:
flip :: (c -> e) -> (b -> (c -> d))
f :: (c -> e)
x :: b
y :: c
此外,我们看到:
(f x) y
所以结果(f x)
是另一个函数,作为输入y
。所以这意味着e ~ b -> f
。因此:
flip :: (c -> (b -> f)) -> (b -> (c -> d))
f :: c -> (b -> f)
x :: b
y :: c
最后我们看到那(f y) x
是 的结果flip f x y
。这意味着结果的类型与 的(f y) x
类型相同d
。所以这意味着f ~ d
。这意味着:
flip :: (c -> (b -> d)) -> (b -> (c -> d))
或者如果我们删除一些多余的括号:
flip :: (c -> b -> d) -> b -> c -> d