在交互网上有一个已知的 \xce\xbb 微积分项的实现的已知实现。但它过于复杂且效率低下。众所周知,Lamping 的抽象算法能够以最佳方式将 xcexbb 微积分项的一个非常大的子集评估为正规形式。此外,它与交互组合器非常相似,只有一个关键区别:不是两种类型的节点,而是无限系列的不同可能节点。换句话说,Lamping的抽象算法只是交互组合器加上整数标签。
\n\n是否可以在交互组合器上有效地模拟这些整数标签(以及抽象算法)?
\n我正在尝试像 Curry 定义的那样实现 Y 组合器。
此代码不起作用。它会导致无限递归。
F = (lambda f: (lambda x: (1 if x == 0 else (x * (f(x-1))))))
Y = (
lambda f:
(lambda x: f(x(x)))
(lambda x: f(x(x)))
)
Y(F)(3)
Run Code Online (Sandbox Code Playgroud)
但是,这个确实有效:
Y = (
lambda f:
(lambda x: f(
lambda v: x(x)(v)
))
(lambda x: f(
lambda v: x(x)(v)
))
)
Y(F)(3)
Run Code Online (Sandbox Code Playgroud)
为什么第一个不起作用,而第二个起作用?
在lambda演算中(λx.λy.λs.λz.xs(ysz))用于添加两个教会数字我们如何解释这一点,是否有任何好的资源用于函数式编程的lambda演算?非常感谢您的帮助
为什么纯粹的无类型lambda演算经常被描述为不可能使用?
有一个合适的函数库,它与其他任何函数式语言都不一样吗?
我正在编写一个编译器/校对检查器,我想知道,如果我有一个这样的语法树,例如:
data Expr
= Lambdas (Set String) Expr
| Var String
| ...
Run Code Online (Sandbox Code Playgroud)
如果有办法检查Exprs 的alpha等价(等价模重命名).Expr然而,这与lambda演算的不同之处在于lambda中的变量集是可交换的 - 即参数的顺序不会影响检查.
(但是,为了简单起见,与此Lambda ["x","y"] ...不同Lambda ["x"] (Lambda ["y"] ...),在这种情况下,顺序确实很重要).
换句话说,给定两个Exprs,如何才能有效地找到从一个到另一个的重命名?NP-complete这种组合问题的气味.
syntax haskell lambda-calculus np-complete abstract-syntax-tree
哪个FP语言遵循lambda演算最接近其代码的外观,感觉,就像lambda演算抽象一样?
给定一个Haskell表达式,我想执行alpha转换,即.重命名一些非自由变量.
我已经开始实现我自己的函数了,它可以在haskell-src-exts Exp树上运行,但事实证明它非常重要,所以我不禁想知道 - 是否有一个易于使用的已建立的库这种源转换的解决方案?理想情况下,它应该与haskell-src-exts集成.
给出以下表达式来总结一个IEnumerable数字:
let sum l = l |> Seq.reduce(+) //version a
Run Code Online (Sandbox Code Playgroud)
有可能消除这个论点 - 就像这样吗?
let sum = Seq.reduce(+) //version b
Run Code Online (Sandbox Code Playgroud)
我从F#编译器(FS0030)得到一个错误,我似乎记得曾经看过有关"eta转换"的内容,但遗憾的是我对lambda calc的了解太少,无法跟踪如何涉及eta转换.
参数可以像版本b一样被删除吗?
有人请指点文献来解释eta转换以及它将如何在这段特殊代码中发挥作用吗?
FS0030:
stdin(1,5):错误FS0030:值限制.值'sum'被推断为具有泛型类型val sum:('_a - > int)当'_a:> seq要么使'sum'的参数显式,要么如果你不打算使它是通用的,添加类型注释.
我无法找到一种方法来将加法定义为重复递增,尽管这在无类型语言中是可能的.这是我的代码:
{-# LANGUAGE RankNTypes #-}
type Church = forall a . (a -> a) -> (a -> a)
zero :: Church
zero = \f -> id
inc :: Church -> Church
inc n = \f -> f . n f
-- This version of addition works
add1 :: Church -> Church -> Church
add1 n m = \f -> n f . m f
-- This version gives me a compilation error
add2 :: Church -> Church -> Church
add2 …Run Code Online (Sandbox Code Playgroud) haskell types lambda-calculus church-encoding higher-rank-types
我正在尝试在Haskell中实现不带Prelude的布尔值。
对表达式beq true true "TRUE" "FALSE"进行评估后,就可以了。但是,当我尝试评估时beq' true true "TRUE" "FALSE",由于预期类型和实际类型之间的某些差异而导致失败。
这是代码。
import qualified Prelude as P
i = \x -> x
k = \x y -> x
ki = k i
true = k
false = ki
not = \p -> p false true
beq = \p q -> p (q true false) (q false true)
beq' = \p q -> p q (not q)
Run Code Online (Sandbox Code Playgroud)
因此,我检查了推论的推断类型。
*Main> :type beq
beq
:: (t1 -> t1 -> t2) …Run Code Online (Sandbox Code Playgroud) lambda-calculus ×10
haskell ×4
algorithm ×1
f# ×1
lambda ×1
np-complete ×1
pointfree ×1
python ×1
python-3.x ×1
syntax ×1
types ×1