【问题标题】:Iteration function in lambda calculuslambda演算中的迭代函数
【发布时间】:2013-10-04 20:01:25
【问题描述】:

我有这样的功能

iter :: Int -> (a -> a) -> a -> a    
iter n f a = f (f ... (f a) .. )

如何在无类型 lambda 演算中定义这样的函数?

任何提示/帮助将不胜感激。

【问题讨论】:

  • 您可能会得到更好的回应:cstheory.stackexchange.com
  • @Dhaivat:当然,如果您将“此问题仅用于研究级问题 - 请阅读常见问题解答”作为更好的回答。
  • 它不是真正的研究水平,但是,我怀疑在 SO 上找到很多使用 lambda 演算的人,因为它是一个高度“基于工作”的社区。​​span>
  • 这个问题是假的:... 是什么意思? (我知道你认为这意味着什么,但这正是你的问题所在。)

标签: lambda-calculus


【解决方案1】:

数字在纯 lambda 演算中本身不存在。您必须为数字设计一种表示形式(并表明它们确实像数字一样)。基本思想是您可以定义数字,以便它们完全是您需要的迭代函数:n 将是一个 lambda 项,当给定函数 f 时,计算 n f的第一次迭代。

这是一个被称为Church Encoding的想法。

【讨论】:

  • 谢谢你的回答,你说的很对,我后来想通了,它会给教会数字在 lambda 演算中的表示
【解决方案2】:
iter == (rec g (fn f (fn n (fn x ((= n 0) x (g f (- n 1) (f x))))))) 

【讨论】:

  • 我设计并实现了一个 lisp 方言,它使用隐式类型进行强类型化,其中 iter 函数可以使用 y-comb 编写如下:(let ((p (fn u (fn v (v ((u u) v))))) (Y (p p)) (iter (Y (fn (lazy iter) (fn (n f a) ((eqw n 0) a (iter (subw n 1) f (f a)))))))) (iter 3 (fn x (mulw x x)) 2)),也可以编写为:((label iter (fn (n f a) ((eqw n 0) a (iter (subw n 1) f (f a))))) 3 (fn x (mulw x x)) 2)
  • 使用iter函数我们可以构造一个循环结构如下:((label iter (fn (n f a) ((eqw n 0) a (iter (subw n 1) f (f a))))) 3 (fn x (set (cdr x) (cons x nil))) (cons nil nil))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多