验证lambda表达式的类型

时间:2014-03-19 03:27:50

标签: haskell lambda-calculus

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

我的方法给了我: result

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

h= \f x -> f (f x)

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

(a -> a) -> a -> a

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

3 个答案:

答案 0 :(得分:9)

请注意,调用f同时使用xf x作为参数 - 这意味着x的类型和f x的类型必须是相同的[1]。继续这个论点之后,我们看到由于xf的输入而f xf的输出,f的输入和输出必须是相同的[2]。

最后,我们检查lambda术语

\f x -> f (f x)

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

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

where:

  b ~ c        by [1]
  a ~ b        by [2]
  d ~ b        by [3]

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

h :: (a -> a) -> a -> a
h f x = f (f x)

答案 1 :(得分:3)

类型(a -> b) -> (c -> d)等同于haskells类型系统中的(a -> b) -> c -> d。您还需要考虑,如果x具有类型a,并且f x具有类型b,则f具有类型a -> b。所以让y = f x。那么f y === f (f x)的类型是什么?

答案 2 :(得分:2)

你的Haskell命令没问题。

但您的类型推断不正确。 x参数的类型应与f的输入类型统一,因为您调用f x,然后输入类型f应与输出类型统一因为您在结果f上调用了f,所以(f x)已被{{1}}。