验证lambda表达式的类型

Wyv*_*666 6 haskell lambda-calculus

我需要验证lambda表达式的类型: lambdaexp

我的方法给了我: 结果

我试图在Haskell(在Hugs上)定义它,如下所示:

h= \f x -> f (f x)
Run Code Online (Sandbox Code Playgroud)

当我打电话给:键入comamnd它给了我:

(a -> a) -> a -> a
Run Code Online (Sandbox Code Playgroud)

是否在Haskell中正确定义了mi函数?或者我的方法给出了错误的结果?

J. *_*son 9

请注意,f使用both xf x作为参数调用 - 这立即意味着类型x和类型f x必须相同[1].从前面开始这个论证,我们看到由于x是输入ff x输出f,输入和输出f必须相同[2].

最后,我们检查lambda术语

\f x -> f (f x)
Run Code Online (Sandbox Code Playgroud)

它有两个输入,f(一个函数)和x,它返回任何返回类型f[3].把所有这些信息放在一起我们有

(a -> b) -> c -> d

where:

  b ~ c        by [1]
  a ~ b        by [2]
  d ~ b        by [3]
Run Code Online (Sandbox Code Playgroud)

因此Haskell推断出的类型是正确的

h :: (a -> a) -> a -> a
h f x = f (f x)
Run Code Online (Sandbox Code Playgroud)

  • 重要的是要注意,因为类型的` - >符号的相关性,这与`(a - > a) - >(a - > a)`相同 - 这可能是OP混淆的一部分. (2认同)