Jam*_*mes 1 polymorphism haskell types function polymorphic-functions
我试图定义以下函数的多态类型:
flip f x y = f y x
Run Code Online (Sandbox Code Playgroud)
我的想法如下:
第一个参数flip,f取两个参数(t1 -> t2 -> t3)
由于函数内部的参数flip,x属于第二个参数类型.t1t1f
第三个参数flip,由于函数内部的参数y而属于类型.t3t3f
我不知道整体回报的多态类型.
但是当我检查ghci中的类型时,我得到:
flip :: (t2 -> t1 -> t) -> t1 -> t2 -> t
Run Code Online (Sandbox Code Playgroud)
有人可以请帮助通过这个例子是什么发生在这里?
谢谢
你的第二个假设是错误的:
由于f函数内的参数t1,因此翻转的第二个参数x是t1类型.
我们先来分析一下这个功能:
flip f x y = f y x
Run Code Online (Sandbox Code Playgroud)
我们看到flip头脑中有三个参数.所以我们先做出类型:
flip :: a -> (b -> (c -> d))
Run Code Online (Sandbox Code Playgroud)
我们当然现在的目标是填写类型.附:
f :: a
x :: b
y :: c
flip f x y :: d
Run Code Online (Sandbox Code Playgroud)
我们在右侧看到:
(f y) x
Run Code Online (Sandbox Code Playgroud)
所以这意味着这f是一个作为输入的函数y.这意味着它a与c -> e(或更短a ~ c -> e)的类型相同.
所以现在:
flip :: (c -> e) -> (b -> (c -> d))
f :: (c -> e)
x :: b
y :: c
Run Code Online (Sandbox Code Playgroud)
此外,我们看到:
(f x) y
Run Code Online (Sandbox Code Playgroud)
所以结果(f x)是另一个函数,作为输入y.所以这意味着e ~ b -> f.从而:
flip :: (c -> (b -> f)) -> (b -> (c -> d))
f :: c -> (b -> f)
x :: b
y :: c
Run Code Online (Sandbox Code Playgroud)
最后我们看到这(f y) x是结果flip f x y.这意味着结果的(f y) x类型与d.所以这意味着f ~ d.这意味着:
flip :: (c -> (b -> d)) -> (b -> (c -> d))
Run Code Online (Sandbox Code Playgroud)
或者,如果我们删除一些冗余括号:
flip :: (c -> b -> d) -> b -> c -> d
Run Code Online (Sandbox Code Playgroud)