标签: lambda-calculus

如何使用命名上下文查找de Bruijn自由变量索引?

在"类型和编程语言"的6.1.2节中,他们讨论了用于对lambda表达式中的自由变量进行编号的命名上下文.使用示例方案,他们已经提供了,都?x.xb?x.xx都会有自己的德布鲁因表示形式?.00时,他们明显不同的术语.这是如何运作的?

lambda-calculus

10
推荐指数
1
解决办法
1838
查看次数

如何在JavaScript中正确地理解函数?

curry在JavaScript中编写了一个简单的函数,可以在大多数情况下正常工作

const add = curry((a, b, c) => a + b + c);

const add2 = add(2);

const add5 = add2(3);

console.log(add5(5));
Run Code Online (Sandbox Code Playgroud)
<script>
const curried = Symbol("curried");

Object.defineProperty(curry, curried, { value: true });

function curry(functor, ...initArgs) {
    if (arguments.length === 0) return curry;

    if (typeof functor !== "function") {
        const value = JSON.stringify(functor);
        throw new TypeError(`${value} is not a function`);
    }

    if (functor[curried] || initArgs.length >= functor.length)
        return functor(...initArgs);

    const result = (...restArgs) => curry(functor, ...initArgs, ...restArgs);

    return …
Run Code Online (Sandbox Code Playgroud)

javascript haskell lambda-calculus currying partial-application

10
推荐指数
2
解决办法
3461
查看次数

完全懒惰的lambda浮动通行证?

我正在阅读实现函数式语言:一个教程,并在实现完全懒惰的lambda提升的浮动传递时遇到了问题.

我想描述浮动如何使这个问题清楚,如果你熟悉它,只需跳到下面的问题.

该概念在本文的第246页介绍,主要在第256-257页实施.

let(rec)表达的情况下,它说:

我们必须在let(rec)表达本身之前放置右侧的浮动定义,因为右侧可能依赖于它们.

例如:

\a ->
  let f = \b -> b + (let $mfe = a * a in $mfe)
  in f
Run Code Online (Sandbox Code Playgroud)

变量$mfe是一个最大自由表达式(MFE),它通过前一次传递识别,当处理let f表达式时,我们f作为一个组浮出并附加到它[(1, [($mfe, a * a)])],这是从右边获得的let f.这里,第一个组件1表示组的自由级别.

当回溯到\a -> f抽象,我们发现,无论是$mfef被它约束,因此我们应该在这里安装它们:

\a ->
  let $mfe = a * a
  in
    let f = \b -> b …
Run Code Online (Sandbox Code Playgroud)

haskell functional-programming lambda-calculus program-transformation

10
推荐指数
0
解决办法
177
查看次数

根据存在类型编码通用类型?

在系统F中,类型exists a. P可以被编码为forall b. (forall a. P -> b) -> b使用存在性的任何系统F术语可以根据关于打字和缩减规则的该编码来表达.

在"类型和编程语言"中,将显示以下练习:

我们可以根据存在类型编码通用类型吗?

我的直觉说这是不可能的,因为在某种程度上,"存在包装"机制并不像"类型抽象"机制那样强大.我如何正式展示这个?

我甚至不确定我需要证明什么才能正式显示这个结果.

type-theory lambda-calculus existential-type system-f

10
推荐指数
0
解决办法
484
查看次数

SKI演算和BCKW的实际应用

我可以理解如何创建和思考SKI和BCKW演算,但我永远无法找到实际用途.也许我看得不够深?也就是说,我想知道(仅仅是一个例子,我并不是暗示这是真的)Java Servlets广泛使用S而Python生成器是BCW的一个例子,我只是无法透过树林看到它?

functional-programming lambda-calculus

9
推荐指数
1
解决办法
1240
查看次数

哈斯克尔的教堂数​​字

我试图使用定义在haskell中打印教堂数字:

0 := ?fx.x
1 := ?fx.f x
Run Code Online (Sandbox Code Playgroud)

Haskell代码:

c0 = \f x -> x
c1 = \f x -> f x
Run Code Online (Sandbox Code Playgroud)

当我在haskell控制台中输入它时,我得到一个错误

    test> c1

    <interactive>:1:0:
    No instance for (Show ((t -> t1) -> t -> t1))
      arising from a use of `print' at <interactive>:1:0-1
    Possible fix:
      add an instance declaration for (Show ((t -> t1) -> t -> t1))
    In a stmt of an interactive GHCi command: print it
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚错误说的是什么.

谢谢!

haskell lambda-calculus

9
推荐指数
2
解决办法
4460
查看次数

system-f中有哪些类型和/或术语无法用Hindley Milner表达

我记得在某处读过Hindley Milner是对system-f的限制.如果是这种情况,有人可以请我提供一些可以输入system-f但不能输入HM的条款.

types type-inference lambda-calculus hindley-milner

9
推荐指数
1
解决办法
563
查看次数

Haskell for Lambda微积分,类型推理

我在Haskell编程中的冒险并非都是史诗般的.我正在实施Simple Lambda Calculus,我很高兴完成Syntax,Evaluation并且Substitution希望它们是正确的.剩下的是typing红色框内的定义(如下图所示),我正在寻找指导.

标题

图1:简单的Lambda微积分

如果我错了,请纠正我,

(1)但我收集的是(T-Var),返回给定变量的类型x.Haskell中的构造返回type什么?我知道prelude它是:t x,但我正在寻找一个有效的main = do.

(2)如果我要定义一个函数type_of,我最有可能需要定义期望和返回类型,例如, type_of (Var x) :: type1 -> type2

type1应该是通用的,并且type2必须是存储变量类型信息的任何对象类型.为此,我迷失了如何定义type1type2.

(3)对于(T-APP)和(T-ABS),我假设我分别应用替换 Abstraction String LambdaApplication Lambda Lambda.简化形式的类型是返回的类型.那是对的吗?

提前致谢...

lambda haskell types functional-programming lambda-calculus

9
推荐指数
2
解决办法
2179
查看次数

使用OCaml中的GADT的简单lambda演算DSL

你如何使用GADT在OCaml中定义一个简单的lambda演算类DSL?具体来说,我无法弄清楚如何正确定义类型检查器以从无类型的AST转换为类型化的AST,也无法找出上下文和环境的正确类型.

下面是一些使用OCaml中传统方法的简单lambda演算语言的代码

(* Here's a traditional implementation of a lambda calculus like language *)

type typ =
| Boolean
| Integer
| Arrow of typ*typ

type exp =
| Add of exp*exp
| And of exp*exp
| App of exp*exp
| Lam of string*typ*exp
| Var of string
| Int of int
| Bol of bool

let e1=Add(Int 1,Add(Int 2,Int 3))
let e2=Add(Int 1,Add(Int 2,Bol false)) (* Type error *)
let e3=App(Lam("x",Integer,Add(Var "x",Var "x")),Int 4)

let rec typecheck con e …
Run Code Online (Sandbox Code Playgroud)

dsl ocaml lambda-calculus gadt

9
推荐指数
2
解决办法
1194
查看次数

有没有有效的方法将一元数转换为二进制数?

让这些数据类型分别代表一元和二元自然数:

data UNat = Succ UNat | Zero
data BNat = One BNat | Zero BNat | End

u0 = Zero
u1 = Succ Zero
u2 = Succ (Succ Zero)
u3 = Succ (Succ (Succ Zero))
u4 = Succ (Succ (Succ (Succ Zero)))

b0 = End                   //   0
b1 = One End               //   1
b2 = One (Zero End)        //  10
b3 = One (One End)         //  11
b4 = One (Zero (Zero End)) // 100

(Alternatively, one could use …
Run Code Online (Sandbox Code Playgroud)

algorithm haskell functional-programming lambda-calculus

9
推荐指数
3
解决办法
2404
查看次数