haskell - 验证 lambda 表达式的类型

标签 haskell lambda-calculus

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

我的方法给了我: result

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

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

当我调用 :type comamnd 时,它会给我:

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

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

最佳答案

请注意,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)

关于haskell - 验证 lambda 表达式的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22495616/

相关文章:

haskell - 如何绑定(bind)函数中的第二个参数而不是第一个参数(以优雅的方式)?

haskell - 如何加速(或内存)一系列相互递归的函数

haskell - 在 haskell 中使用 y 组合器

Python函数式迭代算法?

haskell - Haskell 中的 monad 函数 dist 和 join 之间有什么关系?

haskell - 实际上可以从构造微积分中删除 "Pi"吗?

algorithm - 是否有可能在 Haskell 上推断出纯 λ 函数的归一化源?

lambda-calculus - lambda 演算中的 Beta 缩减 : Order of evaluation important?

postgresql - Yesod persistent-postgresql rawSql 查询与列列表通配符产生语法错误

haskell - 什么是 "free variable"?