Haskell lambda翻译?

时间:2013-01-09 13:55:56

标签: haskell lambda interpreter

我有一个无类型的Lambda微积分 - 上下文评估解释器作为家庭作业,我需要帮助!我不知道如何使用函数式语言! 解释器应提供一个评估函数,例如interpret,它接收输入文件的名称并返回一个字符串列表,表示评估后获得的闭包,包括它们的相关上下文

以下是输入:

    true=\x.\y.x 
    false=\x.\y.y 

    not=\x.((x false) true)
    (not true) 
    (not false)

    and=\x.\y.((x y) false)
    ((and true) true)
    ((and true) false)
    ((and false) true)
    ((and false) false)

    or=\x.\y.((x true) y)
    ((or true) true)
    ((or true) false)
    ((or false) true)
    ((or false) false)

    nil=\x.true
    null=\l.(l \x.\y.false)
    cons=\x.\y.\z.((z x) y)
    car=\l.(l true)
    cdr=\l.(l false)
    if=\p.\then.\else.((p then) else)

fix=\f.(\x.(f (x x)) \x.(f (x x)))
(fix fun)

append=\a.\b.((fix \r.\a.(((if (null a)) b) 
                      ((cons (car a)) (r (cdr a))))) a)
la=((cons x) nil)
lb=((cons y) ((cons z) nil))
lc=((append la) lb) 
(car lc)
(car (cdr lc))
(car (cdr (cdr lc)))

,这是输出:

<\x.\y.x; >
<\x.\y.y; >

<\x.((x false) true); >
<\x.\y.y; x<-true>
<\x.\y.x; x<-false>

<\x.\y.((x y) false); >
<\x.\y.x; >
<\x.\y.y; >
<\x.\y.y; y<-true, x<-false>
<\x.\y.y; y<-false, x<-false>

<\x.\y.((x true) y); >
<\x.\y.x; y<-true, x<-true>
<\x.\y.x; y<-false, x<-true>
<\x.\y.x; >
<\x.\y.y; >

<\x.true; >
<\l.(l \x.\y.false); >
<\x.\y.\z.((z x) y); >
<\l.(l true); >
<\l.(l false); >
<\p.\then.\else.((p then) else); >

<\f.(\x.(f (x x)) \x.(f (x x))); >
(fun (x x))

<\a.\b.((fix \r.\a.(((if (null a)) b)
                ((cons (car a)) (r (cdr a))))) a); >
<\z.((z x) y); y<-nil, x<-x>
<\z.((z x) y); y<-((cons z) nil), x<-y>
<\z.((z x) y); y<-(r (cdr a)), x<-(car a), a<-a, r<-(x x), b<-lb, a<-la>
x
y
z

我需要帮助! 某处有模特吗?或者至少类似的东西呢?我该如何开始?有人做了类似的东西,可以帮助我吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

我认为这不是一个问题。

以下是我将采取的立场。

  1. 了解无类型lambda演算以及如何使用它来表示数据和函数。
  2. 弄清楚为什么你给出的输入应该有你给出的输出。 (您可能还需要了解更多有关方案关闭的信息,具体取决于您在课堂上学到的内容。)
  3. 学习一些基本的Haskell,可能来自Learn You a Haskell;见getting started with Haskell
  4. 搜索Stack Overflow以查找Haskell标记中提及Lambda(大写相关 - 这意味着用户定义的数据构造函数或类型)的问题,以查看有关编写lambda表达式解释器的建议。
  5. 使用write yourself a scheme in 48 hours的第二章来介绍在方案上下文中解析Haskell。
  6. 这可能足以让你自己解决剩下的问题。 (思考时间!你只需要计算和输出字符串。规则是什么?重访2号。)如果没有,有一个关于闭包的后续章节,但我应该警告你不要跳过大量的章节并期待明确的见解。
  7. 对于第一次任务而言,这似乎都是很多工作,如果是的话,我表示哀悼。我曾经有过一位讲师,他在“C和编译器入门”课程中的第一个任务就是用C语言编写一个C编译器,在我看来,这是一个比教学法更多的睾丸激素。