多态类型的函数作为haskell中的参数?

Jam*_*mes 1 polymorphism haskell types function polymorphic-functions

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

flip f x y = f y x
Run Code Online (Sandbox Code Playgroud)

我的想法如下:

  1. 第一个参数flip,f取两个参数(t1 -> t2 -> t3)

  2. 由于函数内部的参数flip,x属于第二个参数类型.t1t1f

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

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

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

flip :: (t2 -> t1 -> t) -> t1 -> t2 -> t
Run Code Online (Sandbox Code Playgroud)

有人可以请帮助通过这个例子是什么发生在这里?

谢谢

Wil*_*sem 5

你的第二个假设是错误的:

由于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.这意味着它ac -> 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)

  • @James:这就是Haskell语法的工作原理.如果你写`foo bar qux foobar`,你隐式写了`((foo bar)qux)foobar` ...注意,在Haskell**中,每个函数只需要一个参数**. (3认同)