1

我试图定义以下函数的多态类型:

flip f x y = f y x

我的想法如下:

  1. 的第一个参数flipf接受两个参数,所以(t1 -> t2 -> t3)

  2. , 的第二个参数由于函数内部的参数flipx具有类型。t1t1f

  3. 的第三个参数flip,由于函数内部的参数y而具有类型。t3t3f

  4. 我不知道整体回报的多态类型。

但是当我检查 ghci 中的类型时,我得到:

flip :: (t2 -> t1 -> t) -> t1 -> t2 -> t

有人可以帮忙看看这个例子是什么吗?

谢谢

4

2 回答 2

5

你的第二个假设是错误的

翻转的第二个参数,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 -> ea ~ 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
于 2017-08-06T19:34:52.113 回答
2

这只是求解方程组的问题。首先,分配未知类型:

f : a1
x : a2
y : a3

接下来,f应用于y. 因此,f必须是一个函数类型,其参数类型与 y 相同,即

f : a1 = a3 -> a4
f y : a4

同样,f y适用于x,所以

f y : a4 = a2 -> a5
f y x : a5

代入这个,我们得到

f : a3 -> a2 -> a5
x : a2
y : a3

我们可以重命名这些类型

t2 = a3
t1 = a2
t  = a5

并得到

f : t2 -> t1 -> t
x : t1
y : t2

函数体是f y x,类型为t = a5

于 2017-08-06T19:38:36.630 回答