我正在尝试解决 Haskell 的以下练习:
\n定义函数exists::(N-> Bool)-> N->Bool,它接收谓词 p 和自然数 n,并且如果 O 和 n 之间存在任意数字且 p 为 true,则返回 True。\n示例:
exists pair three = True\nexists isGreaterThanZero O = False\nRun Code Online (Sandbox Code Playgroud)\n这段代码位于我的存在函数之前:
\n{-#LANGUAGE GADTs #-}\n{-# OPTIONS_GHC -fno-warn-tabs #-}\n{-# OPTIONS_GHC -fno-warn-missing-methods #-}\n\nmodule Naturales where\n\nimport Prelude(Show)\n\ndata Bool where { False :: Bool; \n True :: Bool\n } deriving Show\n\n{- Data Type of Natural Numbers -}\ndata N where { O :: N ; \n S :: N -> N \n } deriving …Run Code Online (Sandbox Code Playgroud) Haskell和Lambda演算中的Python代码是什么?
def f1():
x = 77
def f2():
print x
f2
f1
Run Code Online (Sandbox Code Playgroud)
我在lambda演算中的尝试
\x. 77 (\x.x)
Run Code Online (Sandbox Code Playgroud) 考虑以下lua代码:
f = {}
for i = 1, 10 do
f[i] = function()
print(i .. " ")
end
end
for k = 1, 10 do
f[k]()
end
Run Code Online (Sandbox Code Playgroud)
这将打印从1到10的数字.在这种情况下,i将关闭外部循环的每次迭代的值.这就是我一直都懂得闭合的方式,我很开心......
...直到我将一些lua代码移植到c#中,我试图做同样的事情:
var f = new Action[10];
for (int i = 0; i < 10; i++)
{
f[i] = (new Action(delegate()
{
Console.Write(i + " ");
}));
}
for (int k = 0; k < 10; k++)
{
f[k]();
}
Run Code Online (Sandbox Code Playgroud)
现在我将10号打印10次(让我们忘记了lua数组是基于1的).实际上,在这种情况下,闭包对变量起作用,而不是它的值,这很有意义,因为我只是在第一个循环结束后调用函数.
JavaScript似乎具有相同的语义(接近变量):
var f = []
for (var i = 0; …Run Code Online (Sandbox Code Playgroud) 我正在尝试为处理lambda演算的语言编写一个小编译器.以下是我发现的语言含糊不清的定义:
E ? ^ v . E | E E | ( E ) | v
Run Code Online (Sandbox Code Playgroud)
符号^,.,(,)和v是标记.^表示lambda,v表示变量.形式^ vE的表达式是函数定义,其中v是函数的形式参数,E是其主体.如果f和g是lambda表达式,则lambda表达式fg表示函数f应用于参数g.
在假设函数应用程序是左关联的情况下,我试图为这种语言编写一个明确的语法,例如fgh =(fg)h,并且该函数应用程序比...更严格地绑定,例如(^ x.^ y. xy)^ zz =(^ x.(^ y.xy))^ zz
这是我到目前为止所做的,但我不确定它是否正确:
E -> ^v.E | T
T -> vF | (E) E
F -> v | epsilon
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?
lambda grammar parsing programming-languages lambda-calculus
看起来像这样(示例显示教堂数字和Y组合器):
zero := ?.?.0
one := ?.0 -- or more verbosely: ?.?.1 0
two := ?.?.1 (1 0)
three:= ?.?.1 (1 (1 0))
add := ?.?.?.?.3 1 (2 1 0)
Y := ?.(?.1 (0 0)) (?.1 (0 0))
Run Code Online (Sandbox Code Playgroud)
这种符号的名称是什么?我似乎已经忘记了.
theory lambda functional-programming function lambda-calculus
从我最近阅读的一本书:
第一:
.(..)()((.))
在这一点上,最外层的lambda绑定是不可简化的,因为它没有适用的参数.剩下的就是一次一层地进入术语,直到我们找到可以减少的东西.
下一个:
.(.)((.))
我们可以将lambda绑定应用于参数.我们一直在寻找可以申请的条款.我们可以应用的下一件事是lambda绑定到lambda术语((.)).
我不明白.在第一部分,它说 has no argument to apply to, that I can probably understand, but then at the Next section I think the z可以被束缚,((.))因为正如你所看到的,.(.)身体 clearly has a z论点可以是界.但是,这本书恰恰忽略了头 and directly bound n到((.)).我的意思.是没有n争论,为什么它会受到约束?
有人可以向我解释一下吗?
我有以下lambda演算:
(?x. + (- x 1)) 9 3
Run Code Online (Sandbox Code Playgroud)
正确的beta减少是:
+ (- 9 1) 3
Run Code Online (Sandbox Code Playgroud)
我犯了一个错误,取而代之的是9号码:
+ (- 3 1) 9
Run Code Online (Sandbox Code Playgroud)
而且我得到了相同的结果.
在与解决方案进行比较之前,我没有意识到这是错误的.
我是否必须采取最接近的替代,在这种情况下是9?
只是一个相当简单的问题(所以在我看来).如果两个变量(x)(x)是alpha等价的.是(x1x2)(x2x1)阿尔法相同呢?
我对Haskell中的函数有以下定义.
> q7 :: forall a. forall b. ((a -> b) -> a) -> a
Run Code Online (Sandbox Code Playgroud)
我要么为它创建一个定义,要么说明为什么定义不存在.这是我的想法:
q7接受任何类型的a和b.该声明(a -> b) -> a将通过采取两个项目并返回后者来实施.现在,如果我再进一步,我可以返回同样的" a"来实现((a -> b) -> a) -> a.我看到在一个问题a和b可以是任何类型,因此对于每个实例a,可能a是不同的类型?例如,它可能是这样的((Int -> Bool) -> [Char]) -> Int吗?我可能谋杀了那种语法.如果有人有任何提示,或者有人可以确认或否认我的想法,我将非常感激!
我只是从eta扩展中找到了一些间接线索
SimpleExpr :: = SimpleExpr1`_
'如果表达式_是方法类型或如果是按名字调用参数,则表达式_的格式正确。
如果是带有参数的方法,则_表示通过eta扩展转换为函数类型。
如果是类型=>的无参数方法或按名称调用参数,则_表示类型()=>的函数,该函数评估何时将其应用于空的参数列表()。
所以我猜eta是匿名函数表达的缩写吗?我对吗?