我可以使用方案相当容易地定义教堂数字:
> (define f (lambda (x) x))
> (f f) ;0
#<procedure:f>
> (f (f f)) ;1
#<procedure:f>
Run Code Online (Sandbox Code Playgroud)
但是,这并不容易认识到(f f)0和(f(ff))是1.有没有办法让这些数字更具可读性?这将是理想的:
> (f f)
0
> (f (f f))
1
Run Code Online (Sandbox Code Playgroud)
示例是在计划中,但我会在任何口齿不清的情况下回答.
我正在读报纸Generics of a Higher Kind,第一句是
在Java 5和C#2.0中,一阶参数多态性以泛型的名义在主流的面向对象编程语言中引入.
我不知道什么是一阶参数多态,我也不太明白什么是一阶函数,我知道高阶函数是一个函数,它接受一个函数并返回一个函数,但我不知道什么是零 - 订单功能,一阶功能.我从这里看到了一个解释,像这样:
f - > g是零阶
f - > g - > h是一阶
f - > g - > h - > i是二阶
等.
有人能为我解释这两个词吗?
我听说可以if用lambda 替换一个语句.
这在Python中可行吗?如果是这样,怎么样?
最近我在阅读关于 Lambda 演算和 Church Encoding 的文章,虽然我对它们的含义形成了远程理解,但我很难找到使用高阶函数来表示数值或列表而不是直接使用数值或列表的目的.
在编程中,在 Church-Encoded 表达式上执行 Lambda 演算对机器资源来说是极其繁重的,而且似乎是一种效率低得多的技术。我发现程序员通常认为这是糟糕的编程实践,除了 Scheme 或 Haskell 程序员,出于奇怪的原因。
使用 Church 编码有什么实际的实际原因吗?还是只对理论学习有用?
我是haskell的初学者,并试图了解Let vs Where wiki页面.最后有一个例子,x在函数定义的左侧添加参数会fib改变语义.
fib1 =
let fib' 0 = 0
fib' 1 = 1
fib' n = fib1 (n - 1) + fib1 (n - 2)
in (map fib' [0 ..] !!)
fib2 x =
let fib' 0 = 0
fib' 1 = 1
fib' n = fib2 (n - 1) + fib2 (n - 2)
in map fib' [0 ..] !! x
Run Code Online (Sandbox Code Playgroud)
维基页面声明"在第二种情况下[ fib2],为每个参数x"重新定义了fib'.我正在寻找一个初学者友好的解释为什么会发生这种情况,一般来说,是否有更多这样隐藏的副作用?
维基页面还有一个关于eta减少的解释的链接,该解释表明表达式和它的eta减少是等价的.那么,如果fib2是eta抽象fib1,为什么它们不等同?
我正在尝试构建一个接受给定数量的参数并始终返回相同值的函数。
这是家庭作业的一部分。提供了一个提示:
“k-way T”是一个接受 k 个参数并始终返回 T 的函数。“0-way T”就是 T。
其中 k 作为 Church Numeral 提供,T 是 True (\x.\yx) 的 lambda 表达式。
完整的任务是提供一个计算 k 路 OR 函数的 lambda 表达式。其中“布尔”参数的数量在“布尔”参数之前提供。例如:
((OR 3) F T F)
Run Code Online (Sandbox Code Playgroud)
但现在我正在尝试创建一个接受k 个参数并始终返回T 的程序。k作为第一个参数提供。
((TRUE 2) T F) == T
Run Code Online (Sandbox Code Playgroud)
所以基本上我不想创建一个函数,为每个教会数字“迭代”多一个参数。
但不知怎的,我完全陷入困境。
我可以只使用教堂数字来做到这一点吗?或者我需要递归(Y-Combinator)吗?
一般来说:是否有任何好的工具(例如可视化工具)支持创建 lambda 表达式。
我真的对 lambda 演算的力量感到惊讶,我真的很想学习它。但我不知道如何...
提前致谢
我在Haskell学习lambda演算,在那期间,我遇到了这个问题.
这些问题的解决方案是这样的:
但我无法理解他们如何得出答案.就像eq一样,我不明白他们是如何做到这一点的: ?ab.a b (b (?xy.y) (?xy.x))
和nand一样.如果有人解释它并帮助我理解这个问题,那将是非常好的.
谢谢.
在 OCaml 中,“fun”对我来说似乎是绑定运算符。OCaml 有内置替换吗?如果有,如何实施?是使用de Bruijn索引实现的吗?
只是想知道如何在 OCaml 中实现非类型化 lambda 演算,但没有找到这样的实现。
如何在(纯)构造演算中定义递归函数?我在那里没有看到任何固定点组合器。
recursion functional-programming lambda-calculus coq typed-lambda-calculus
这是我第一次学习函数式编程。我确实理解简单的 beta 减少是如何工作的。
例如:
(\x->2*x)5
Run Code Online (Sandbox Code Playgroud)
意味着您将 xs 替换为 5。
2*5=10
Run Code Online (Sandbox Code Playgroud)
然而,其他例子让我感到困惑
(\f->f(f 0))(\x->x+1)
Run Code Online (Sandbox Code Playgroud)
我们已经了解了一些评估策略,头范式和弱头范式。
从我的笔记中,我明白头部范式意味着没有 redex 表达式,而弱头部范式意味着存在 lambda 抽象。
这对我来说没有任何意义。两者之一是否适用于最后一个示例?如果是这样,其他策略的例子是什么?
lambda-calculus ×10
haskell ×3
lambda ×3
coq ×1
if-statement ×1
ocaml ×1
python ×1
recursion ×1
scala ×1
semantics ×1