我们偶尔会有人问关于在Haskell中实现无类型lambda演算的问题。[当然,我现在找不到这些问题中的任何一个,但我肯定我已经看到了!]只是为了傻笑,我想我应该花点时间玩这个。
做一些像这样的事情已经足够微不足道了
i = \ x -> x
k = \ x y -> x
s = \ f g x -> (f x) (g x)
s i i
data Term = T (Term -> Term)
T f ! x = f x
i = T $ \ x -> x
k = T $ \ x -> T $ \ y -> x
s = T $ \ f -> T $ \ g -> T $ \ x -> (f ! x) ! (g ! x)
这工作得很好,并且允许构造和执行任意的lambda表达式。例如,我们可以轻松地构建一个函数,将int
转换为教会数字:
zero = k ! i
succ = s ! (s ! (k ! s) ! k)
encode 0 = zero
encode n = succ ! (encode $ n-1)
同样,这是完美的。
现在写一个解码函数。
data Term x = F (Term x -> Term x) | R (Term x -> x)
F f ! x = f x
R f ! x = R $ \ _ -> f x
out :: Term x -> x
out (R f) = f (error "mu")
out (F _) = (error "nu")
i = F $ \ x -> x
k = F $ \ x -> F $ \ y -> x
s = F $ \ f -> F $ \ g -> F $ \ x -> (f ! x) ! (g ! x)
decode :: Term Int -> Int
decode ti = out $ ti ! R (\ tx -> 1 + out tx) ! R (\ tx -> 0)
这是有效的:
something = F $ \ x -> F $ \ n -> F $ \ s -> s ! x
nothing = F $ \ n -> F $ \ s -> n
encode :: Maybe x -> Term x
encode (Nothing) = nothing
encode (Just x) = something ! x
这不会:
decode :: Term x -> Maybe (Term x)
decode tmx = out $ tmx ! R (\ tx -> Nothing) ! R (\ tx -> Just tx)
我已经尝试了十几个轻微的变化;没有一个类型检查。不是我不明白它为什么会失败,而是我想不出任何方法让它成功。(特别地,R just
明显是错误的。)
比我聪明的人有更好的主意吗?
好吧,我找到了解决办法:
上面的代码有项X
,由R
的结果类型参数化。与其这样做(并使类型检查器崩溃),不如构造一些类型值
,它可以表示您希望返回的每个结果类型。现在我们有
data Term = F (Term -> Term) | R (Term -> Value)
将所有可能的结果类型折叠成一个不透明的value
类型后,我们就可以完成工作了。
data Value = V Int [Term]
decode :: Term -> Maybe Term
decode tmx =
case tmx ! R (\ _ -> V 0 []) ! R (\ tx -> V 1 [tx]) of
V 0 [] -> Nothing
V 1 [tx] -> Just tx
_ -> error "not a Maybe"
null = F $ \ n -> F $ \ c -> n
cons = F $ \ x -> n $ \ xs -> F $ \ n -> F $ \ c -> c ! x ! xs
encode :: [Term] -> Term
encode ( []) = null
encode (x:xs) = cons ! x ! encode xs
decode :: Term -> [Term]
decode txs =
case out $ txs ! R (\ txs -> V 0 []) ! F (\ tx -> R $ \ txs -> V 1 [tx, txs]) of
V 0 [] -> []
V 1 [tx, txs] -> tx : decode txs
_ -> error "not a list"
当然,您必须猜测需要应用哪个解码函数。但这是给你的非类型化λ微积分!
冒犯性的术语显然是(S K K) 我认为问题产生于多态性的缺乏,因为当我键入check这个haskell代码时,它工作得很好:
主要内容:计算极限,使用Octave计算极限,验证极限的基本属性,使用Octave验证极限的基本属性,左右边界极限MATLAB提供了解决微分和积分微积分的各种方法,求解任何程度的微分方程和极限计算。可以轻松绘制复杂功能的图形,并通过求解原始功能以及其衍生来检查图形上的最大值,最小值和其他固定点。 本章将介绍微积分问题。在本章中,将讨论预演算法,即计算功能限制和验证限制属性。 在下一章微分中,将计表达式的导数,并找到一个图的局部最大值和最小值。我们还将讨论求解微分方程。 最后,在“整合/集成”一章
说明 整理自“3Blue1Brown - 微积分的本质系列视频” 本系列的视频目的在于帮助你建立关于微积分的基本直觉 目录 微积分回忆 求导公式 乘积法则 链式法则 隐函数求导 积分、微分的互逆关系 泰勒级数 ... 微积分的三个中心思想: 积分 微分 积分与微分(导数)的互逆 (几位)微积分之父 发现微积分:巴罗(Barrow)、牛顿(Newton)、莱布尼茨(Leibniz) 给出严格定义:柯
以下是MathML中可用的微积分符号列表。 MathML符号 HTML实体 Hex代码 描述 ′ ′ ′ Prime(一阶导数) ″ ′ ″ 双素数(二阶导数) ‴ ‴ ‴ 三重素数(三阶导数) ∂ ∂ ∂ 指定偏微分 δ δ Δ 指定增量 ∇ &del; ∇ 指定渐变 ∫ ∫ ∫ 指定积分 ∬ ∫ ∬ 指定双积分 ∭ &
部分答案可能来自领域理论。如果我理解正确的话,的元素并不全是集合论函数(根据康托定理,这些函数比大),而只是连续函数。如果是,定义这种连续性的拓扑是什么?为什么类型的Haskell术语对它是连续的?
以下代码可以用javac和Eclipse 4.6.1/4.6编译,但在Eclipse 4.6.2中会产生一个错误: Eclipse 4.6.2 在 下抱怨存在类型不匹配:无法从 int 转换为可比较 我认为的参数应该是