【问题标题】:What is required to extend an Untyped Lambda calculus implementation to cover the Simply Typed Lambda Calculus?扩展无类型 Lambda 演算实现以涵盖简单类型 Lambda 演算需要什么?
【发布时间】:2016-06-21 05:14:42
【问题描述】:

Matt Might 谈论在7 lines of Scheme 中实现Lambda Calculus 解释器:

; eval takes an expression and an environment to a value
(define (eval e env) (cond
  ((symbol? e)       (cadr (assq e env)))
  ((eq? (car e) 'λ)  (cons e env))
  (else              (apply (eval (car e) env) (eval (cadr e) env)))))

; apply takes a function and an argument to a value
(define (apply f x)
  (eval (cddr (car f)) (cons (list (cadr (car f)) x) (cdr f))))

; read and parse stdin, then evaluate:
(display (eval (read) '())) (newline)

现在这不是Simply Typed Lambda Calculus。在core of Haskell 中,有一个Intermediate LanguageSystem F 非常相似。一些(包括Simon Peyton Joneshave called thisSimply Typed Lambda Calculus 的实现。

我的问题是:扩展无类型 Lambda 演算实现以涵盖简单类型 Lambda 演算需要什么?

【问题讨论】:

  • 系统 F 不是 STLC。
  • Simon Peyton Jones 从未将 System F 称为简单类型 lambda 演算的实现。此外,GHC 的中间语言具有 System F 所缺乏的几个重要特性。其中最突出的可能是一般递归(Recletrec 形式)。

标签: haskell scheme lambda-calculus system-f


【解决方案1】:

不清楚你在问什么,但我能想到几个有效的答案:

  • 需要更改表示以适应 lambda 抽象引入的变量的类型注释。

  • 根据您的表述,可能会表述非良好类型的术语。如果是这样,您将需要实现类型检查器。

  • 对于评估,除了忽略类型注释(这是type erasure 的全部要点)之外,您无需更改 LC 评估程序中的任何内容。但是,如果您编写一个基本上是 evalUntyped . eraseTypes 的评估器,那么您可能比编写一个定制的 evalTyped 函数更难证明它是完全的。

【讨论】:

    【解决方案2】:

    简单类型的 lambda 演算 (STLC) 只是在您描述的系统中添加了一个类型检查器。也就是说,您可以将此评估器视为 STLC 的“运行时系统”。

    侧节点:通常会在语言中添加类型注释以简化类型检查器的工作,但它们不是必需的。

    【讨论】:

    • ……什么例子?您是要我在 Scheme 中实现 STLC 类型系统吗?不确定。
    【解决方案3】:

    上面有一些很好的答案——我无意贬低它们。

    在实现类型检查器方面——在 Haskell 中它更简单(尽管可以想象这可以移植到 Scheme)。

    这是Simply Typed Lambda Calculus 的Haskell that is an implementation 中的简单类型检查器:

    type OType = ObjType (Fix ObjType)
    type OEnvironment = Map TermIdentifier OType
    
    check :: OEnvironment -> Term OType -> OType
    check env (Var i) = case lookup i env of
                          Nothing -> error $ "Unbound variable " ++ i
                          Just v -> v
    check env (App f p) = let t_f = check env f
                              t_p = check env p
                           in case t_f of
                                Fun (Fix t_p') (Fix r)
                                  | t_p == t_p' -> r
                                  | otherwise -> error "Parameter mismatch"
                                _ -> error "Applied a non-function"
    check env (Lam i ty t) = let r = check (insert i ty env) t
                              in Fun (Fix ty) (Fix r)
    

    这里是 Haskell 中的简单类型 Lambda 演算的 another implementation

    import Control.Applicative ((<$), (<$>))
    import Control.Monad (guard)
    import Safe (atMay)
    
    data Type
        = Base
        | Arrow Type Type
        deriving (Eq, Ord, Read, Show)
    
    data Term
        = Const
        | Var Int -- deBruijn indexing; the nearest enclosing lambda binds Var 0
        | Lam Type Term
        | App Term Term
        deriving (Eq, Ord, Read, Show)
    
    check :: [Type] -> Term -> Maybe Type
    check env Const = return Base
    check env (Var v) = atMay env v
    check env (Lam ty tm) = Arrow ty <$> check (ty:env) tm
    check env (App tm tm') = do
        Arrow i o <- check env tm
        i' <- check env tm'
        guard (i == i')
        return o
    
    eval :: Term -> Term
    eval (App tm tm') = case eval tm of
        Lam _ body -> eval (subst 0 tm' body)
    eval v = v
    
    subst :: Int -> Term -> Term -> Term
    subst n tm Const = Const
    subst n tm (Var m) = case compare m n of
        LT -> Var m
        EQ -> tm
        GT -> Var (m-1)
    subst n tm (Lam ty body) = Lam ty (subst (n+1) tm body)
    subst n tm (App tm' tm'') = App (subst n tm tm') (subst n tm tm'')
    
    evalMay :: Term -> Maybe Term
    evalMay tm = eval tm <$ check [] tm
    

    【讨论】:

    • 这看起来应该是一个带有两个链接的评论。
    猜你喜欢
    • 2021-10-26
    • 2015-09-29
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多