- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们偶尔会有人询问如何在 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)
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
显然是错误的类型。)
forall x y. Term x -> Term y
.因为,对于纯粹的无类型术语,这应该始终是可能的。仅涉及
R
的条款那行不通的地方。但我不知道如何在 Haskell 类型系统中表达它。
F
的类型更改为
forall x. Term x -> Term x
。现在
k
的定义类型错误,因为内部
F $ \ y -> x
实际上不能返回任何类型,而只能返回 [now fixed] 类型
x
。)
最佳答案
好的,我找到了解决方案:
上面的代码有 Term x
,由 R
的结果类型参数化.而不是这样做(并吓坏类型检查器),构造一些类型 Value
它可以代表您想要返回的每种结果类型。现在我们有
data Term = F (Term -> Term) | R (Term -> Value)
Value
类型,我们可以做我们的工作。
data Value = V Int [Term]
Value
是
Int
表示一个 ADT 值构造函数,后跟一个
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"
关于haskell - 无类型 lambda 演算的冒险,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31348141/
我有 - class A { // contains certain set() and get() methods } class B extends A { public A ge
我有我的 java 进程(在我的系统中)试图与远程系统的/tmp 目录中的 shellscript(details1.sh)对话(当然这两个系统是连接的)。但是我得到了这个异常(exception)-
我正在学习 JavaScript,并慢慢地理解为什么某个页面不起作用:) 我正在做这样的事情: Remove All Markers 我们认为发送此信息是处理事情的正确方法。但我想我并没有真正理解“这
这就是我在paintComponent中所拥有的(省略了其他大部分内容,只是与一个名为Item的对象对象有关,该对象带有多边形字段,if语句的显式参数对该问题并不重要) 目前,它显示为纯白色,因为我将
我在使用 localStorage 的 Internet Explorer 9 中遇到了有趣的问题。我在使用 i18next 库的 Web 项目中使用客户端本地化,并决定使用 localStorage
我是一名优秀的程序员,十分优秀!