[英]Polymorphic type of functions as parameter in haskell?
我试图定义以下函数的多态类型:
flip f x y = f y x
我的想法是:
flip
第一个参数f
接受两个参数,因此(t1 -> t2 -> t3)
flip
第二个参数,由于f
函数中的参数t1
, x
为t1
类型。
flip
第三个参数y
,由于f
函数中的参数t3
,其类型为t3
。
我不知道整体回报的多态类型。
但是,当我在ghci中检查类型时,我得到:
flip :: (t2 -> t1 -> t) -> t1 -> t2 -> t
有人可以帮忙看看这个例子是怎么回事吗?
谢谢
您的第二个假设是错误的 :
flip的第二个参数,由于f函数中的参数t1,x的类型为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
是一个将y
作为输入的函数。 因此,这意味着a
与c -> e
(或更短a ~ c -> e
)。
所以现在:
flip :: (c -> e) -> (b -> (c -> d))
f :: (c -> e)
x :: b
y :: c
此外,我们看到:
(f x) y
因此(fx)
的结果是另一个函数,输入y
。 因此,这意味着e ~ b -> f
。 从而:
flip :: (c -> (b -> f)) -> (b -> (c -> d))
f :: c -> (b -> f)
x :: b
y :: c
最终,我们看到(fy) x
是flip fxy
的结果。 因此,这意味着(fy) x
的结果类型与d
相同。 因此,这意味着f ~ d
。 因此,这意味着:
flip :: (c -> (b -> d)) -> (b -> (c -> d))
或者,如果我们删除一些多余的括号:
flip :: (c -> b -> d) -> b -> c -> d
这只是解决方程组的问题。 首先,分配未知类型:
f : a1
x : a2
y : a3
接下来,将f
应用于y
。 因此, f
必须是带有与y相同类型的参数的函数类型,即
f : a1 = a3 -> a4
f y : a4
同样, fy
应用于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
函数主体为fyx
,类型为t = a5
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.