gpt4 book ai didi

haskell - 是否可以通过修改这个简单的 reducer 来展示不同的评估策略?

转载 作者:行者123 更新时间:2023-12-04 02:26:14 24 4
gpt4 key购买 nike

我是那种更喜欢通过看代码而不是阅读冗长的解释来学习的人。这可能是我不喜欢长篇学术论文的原因之一。代码是明确的、紧凑的、无噪音的,如果你没有得到什么东西,你可以玩它——不需要问作者。

这是 Lambda 演算的完整定义:

-- A Lambda Calculus term is a function, an application or a variable.
data Term = Lam Term | App Term Term | Var Int deriving (Show,Eq,Ord)

-- Reduces lambda term to its normal form.
reduce :: Term -> Term
reduce (Var index) = Var index
reduce (Lam body) = Lam (reduce body)
reduce (App left right) = case reduce left of
Lam body -> reduce (substitute (reduce right) body)
otherwise -> App (reduce left) (reduce right)

-- Replaces bound variables of `target` by `term` and adjusts bruijn indices.
-- Don't mind those variables, they just keep track of the bruijn indices.
substitute :: Term -> Term -> Term
substitute term target = go term True 0 (-1) target where
go t s d w (App a b) = App (go t s d w a) (go t s d w b)
go t s d w (Lam a) = Lam (go t s (d+1) w a)
go t s d w (Var a) | s && a == d = go (Var 0) False (-1) d t
go t s d w (Var a) | otherwise = Var (a + (if a > d then w else 0))

-- If the evaluator is correct, this test should print the church number #4.
main = do
let two = (Lam (Lam (App (Var 1) (App (Var 1) (Var 0)))))
print $ reduce (App two two)

在我看来,上面的“reduce”函数更多地说明了 Lambda 演算,而不是一页页的解释,我希望我在开始学习时能看一下它。您还可以看到它实现了一个非常严格的评估策略,甚至可以在抽象内部进行。以这种精神, 如何修改该代码以说明 LC 可以具有的许多不同的评估策略(按名称调用、惰性评估、按值调用、按共享调用、部分评估等)?

最佳答案

Call-by-name 只需要一些更改:

  • 不评估 lambda 抽象的主体:reduce (Lam body) = (Lam body) .
  • 不评估应用程序的论点。相反,我们应该按原样替换它:
    reduce (App left right) = case reduce left of
    Lam body -> reduce (substitute right body)

  • 按需调用(又名惰性求值)似乎更难(或者可能不可能)以完全声明的方式实现,因为我们需要记住表达式的值。我看不到通过细微更改来实现它的方法。

    共享调用不适用于简单的 lambda 演算,因为这里没有对象和赋值。

    我们也可以使用完全的 beta 缩减,但我们需要选择一些确定性的评估顺序(我们不能选择一个“任意”的 redex 并使用我们现在拥有的代码来缩减它)。这种选择将产生一些评估策略(可能是上述之一)。

    关于haskell - 是否可以通过修改这个简单的 reducer 来展示不同的评估策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29869068/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com