- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近完成了以 Haskell 和 Agda(一种依赖类型的函数式编程语言)为特色的大学类(class),并想知道是否可以用组合逻辑替换这些中的 lambda 演算。使用 Haskell,这似乎可以使用 S 和 K 组合器,从而使其无点。我想知道 Agda 的等价物是什么。即,可以在不使用任何变量的情况下制作一种与 Agda 等效的依赖类型函数式编程语言吗?
另外,是否有可能以某种方式用组合器代替量化?我不知道这是否是巧合,但例如通用量化使类型签名看起来像 lambda 表达式。有没有办法从类型签名中删除通用量化而不改变其含义?例如。在:
forall a : Int -> a < 0 -> a + a < a
最佳答案
所以我想了很多,并取得了一些进展。这是对 Martin-Löf 令人愉快的简单(但不一致)Set : Set
系统以组合风格进行编码的第一次尝试。这不是一个好的结束方式,但它是最容易开始的地方。这种类型理论的语法只是带有类型注释、Pi 类型和宇宙集的 lambda 演算。
目标类型理论
为了完整起见,我将介绍规则。上下文有效性只是说您可以通过连接居住在 Set
中的新变量来从空构建上下文。
G |- valid G |- S : Set
-------------- ----------------------------- x fresh for G
. |- valid G, x:S |- valid
G |- valid G |- S : Set G |- T : Pi S \ x:S -> Set
------------------ ---------------------------------------------
G |- Set : Set G |- Pi S T : Set
G |- S : Set G, x:S |- t : T x G |- f : Pi S T G |- s : S
------------------------------------ --------------------------------
G |- \ x:S -> t : Pi S T G |- f s : T s
G |- valid G |- s : S G |- T : Set
-------------- x:S in G ----------------------------- S ={beta} T
G |- x : S G |- s : T
(x : S) -> T
变为
Pi S \ x:S -> T
。
(\ x -> t) s
这样的 beta-redex,就像您一样无法从整体中猜测部分的类型。我建议现代设计师检查类型并从语法中排除 beta-redexes。)
Set:Set
允许对各种“说谎者悖论”进行编码。当 Martin-Löf 提出这个理论时,吉拉德给他发送了一个在他自己不一致的系统 U 中的编码。随后的悖论由于赫肯斯是我们所知道的最整洁的有毒建筑。)
data SKUP = S | K | U | P deriving (Show, Eq)
data Unty a
= C SKUP
| Unty a :. Unty a
| V a
deriving (Functor, Eq)
infixl 4 :.
a
表示的自由变量的方法。除了对我来说是一种反射(每个名副其实的语法都是一个带有
return
嵌入变量和
>>=
执行替换的自由 monad),它会很方便地表示转换带有绑定(bind)的术语过程中的中间阶段到它们的组合形式。
norm :: Unty a -> Unty a
norm (f :. a) = norm f $. a
norm c = c
($.) :: Unty a -> Unty a -> Unty a -- requires first arg in normal form
C S :. f :. a $. g = f $. g $. (a :. g) -- S f a g = f g (a g) share environment
C K :. a $. g = a -- K a g = a drop environment
n $. g = n :. norm g -- guarantees output in normal form
infixl 4 $.
data Tm a
= Var a
| Lam (Tm a) (Tm (Su a)) -- Lam is the only place where binding happens
| Tm a :$ Tm a
| Pi (Tm a) (Tm a) -- the second arg of Pi is a function computing a Set
| Set
deriving (Show, Functor)
infixl 4 :$
data Ze
magic :: Ze -> a
magic x = x `seq` error "Tragic!"
data Su a = Ze | Su a deriving (Show, Functor, Eq)
Su a
比
a
多一个元素,我们将其用作绑定(bind)器下的自由变量类型,其中
Ze
作为新绑定(bind)变量,
Su x
是旧自由变量的移位表示
x
。
tm :: Tm a -> Unty a
tm (Var a) = V a
tm (Lam _ b) = bra (tm b)
tm (f :$ a) = tm f :. tm a
tm (Pi a b) = C P :. tm a :. tm b
tm Set = C U
bra :: Unty (Su a) -> Unty a -- binds a variable, building a function
bra (V Ze) = C S :. C K :. C K -- the variable itself yields the identity
bra (V (Su x)) = C K :. V x -- free variables become constants
bra (C c) = C K :. C c -- combinators become constant
bra (f :. a) = C S :. bra f :. bra a -- S is exactly lifted application
U
和
P
只是设置构造函数,因此,编写未翻译的类型并允许 Pi 的“Agda 表示法”,我们应该有
U : Set
P : (A : Set) -> (B : (a : A) -> Set) -> Set
K
组合器用于将某种类型的值
A
提升为某个其他类型
G
上的常数函数。
G : Set A : Set
-------------------------------
K : (a : A) -> (g : G) -> A
S
组合器用于将应用程序提升到一个类型上,所有部分都可能依赖于该类型。
G : Set
A : (g : G) -> Set
B : (g : G) -> (a : A g) -> Set
----------------------------------------------------
S : (f : (g : G) -> (a : A g) -> B g a ) ->
(a : (g : G) -> A g ) ->
(g : G) -> B g (a g)
S
的类型,您会发现它准确地说明了类型理论的上下文应用规则,因此它适合反射(reflect)应用程序结构。这就是它的工作!
f : Pi A B
a : A
--------------
f a : B a
---------
U : U
---------------------------------------------------------
P : PU(S(S(KP)(S(S(KP)(SKK))(S(KK)(KU))))(S(KK)(KU)))
G : U
A : U
-----------------------------------------
K : P[A](S(S(KP)(K[G]))(S(KK)(K[A])))
G : U
A : P[G](KU)
B : P[G](S(S(KP)(S(K[A])(SKK)))(S(KK)(KU)))
--------------------------------------------------------------------------------------
S : P(P[G](S(S(KP)(S(K[A])(SKK)))(S(S(KS)(S(S(KS)(S(KK)(K[B])))(S(KK)(SKK))))
(S(S(KS)(KK))(KK)))))(S(S(KP)(S(S(KP)(K[G]))(S(S(KS)(S(KK)(K[A])))
(S(S(KS)(KK))(KK)))))(S(S(KS)(S(S(KS)(S(KK)(KP)))(S(KK)(K[G]))))
(S(S(KS)(S(S(KS)(S(KK)(KS)))(S(S(KS)(S(S(KS)(S(KK)(KS)))
(S(S(KS)(S(KK)(KK)))(S(KK)(K[B])))))(S(S(KS)(S(S(KS)(S(KK)(KS)))(S(KK)(KK))))
(S(KK)(KK))))))(S(S(KS)(S(S(KS)(S(KK)(KS)))(S(S(KS)(S(KK)(KK)))
(S(S(KS)(KK))(KK)))))(S(S(KS)(S(S(KS)(S(KK)(KS)))(S(KK)(KK))))(S(KK)(KK)))))))
M : A B : U
----------------- A ={norm} B
M : B
Set:Set
的组合演示!
G
和
A
的
B
、
S
和
K
参数,仅从术语中即可。相应地,我们可以通过算法验证类型推导,但我们不能像原始系统那样只对组合项进行类型检查。可能有效的是要求类型检查器的输入带有关于 S 和 K 使用的类型注释,从而有效地记录推导。但这是另一 jar 蠕虫......
pil
函数,它结合了 Pi 和 lambda 以避免重复域类型,并且非常有用地允许我使用 Haskell 的函数空间来绑定(bind)变量。也许您几乎可以阅读以下内容!
pTy :: Tm a
pTy = fmap magic $
pil Set $ \ _A -> pil (pil _A $ \ _ -> Set) $ \ _B -> Set
kTy :: Tm a
kTy = fmap magic $
pil Set $ \ _G -> pil Set $ \ _A -> pil _A $ \ a -> pil _G $ \ g -> _A
sTy :: Tm a
sTy = fmap magic $
pil Set $ \ _G ->
pil (pil _G $ \ g -> Set) $ \ _A ->
pil (pil _G $ \ g -> pil (_A :$ g) $ \ _ -> Set) $ \ _B ->
pil (pil _G $ \ g -> pil (_A :$ g) $ \ a -> _B :$ g :$ a) $ \ f ->
pil (pil _G $ \ g -> _A :$ g) $ \ a ->
pil _G $ \ g -> _B :$ g :$ (a :$ g)
pil
的方法。首先,我定义了一个
Fin
ite set 类,用于变量。每个这样的集合都有一个保留构造函数的
emb
加入上面的集合,加上一个新的
top
元素,你可以区分它们:
embd
函数告诉你一个值是否在
emb
的图像中.
class Fin x where
top :: Su x
emb :: x -> Su x
embd :: Su x -> Maybe x
Fin
和
Ze
实例化
Suc
instance Fin Ze where
top = Ze -- Ze is the only, so the highest
emb = magic
embd _ = Nothing -- there was nothing to embed
instance Fin x => Fin (Su x) where
top = Su top -- the highest is one higher
emb Ze = Ze -- emb preserves Ze
emb (Su x) = Su (emb x) -- and Su
embd Ze = Just Ze -- Ze is definitely embedded
embd (Su x) = fmap Su (embd x) -- otherwise, wait and see
class (Fin x, Fin y) => Le x y where
wk :: x -> y
wk
函数应该将
x
的元素嵌入为
y
的最大元素,以便
y
中的额外内容更小,因此在 de Bruijn 索引项中,更局部地绑定(bind)。
instance Fin y => Le Ze y where
wk = magic -- nothing to embed
instance Le x y => Le (Su x) (Su y) where
wk x = case embd x of
Nothing -> top -- top maps to top
Just y -> emb (wk y) -- embedded gets weakened and embedded
lam :: forall x. Tm x -> ((forall y. Le (Su x) y => Tm y) -> Tm (Su x)) -> Tm x
lam s f = Lam s (f (Var (wk (Ze :: Su x))))
pil :: forall x. Tm x -> ((forall y . Le (Su x) y => Tm y) -> Tm (Su x)) -> Tm x
pil s f = Pi s (lam s f)
关于haskell - 直觉类型理论的组合逻辑等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11406786/
我正在尝试编写一个相当多态的库。我遇到了一种更容易表现出来却很难说出来的情况。它看起来有点像这样: {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE
谁能解释一下这个表达式是如何工作的? type = type || 'any'; 这是否意味着如果类型未定义则使用“任意”? 最佳答案 如果 type 为“falsy”(即 false,或 undef
我有一个界面,在IAnimal.fs中, namespace Kingdom type IAnimal = abstract member Eat : Food -> unit 以及另一个成功
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
在 C# 中,default(Nullable) 之间有区别吗? (或 default(long?) )和 default(long) ? Long只是一个例子,它可以是任何其他struct类型。 最
假设我有一个案例类: case class Foo(num: Int, str: String, bool: Boolean) 现在我还有一个简单的包装器: sealed trait Wrapper[
这个问题在这里已经有了答案: Create C# delegate type with ref parameter at runtime (1 个回答) 关闭 2 年前。 为了即时创建委托(dele
我正在尝试获取图像的 dct。一开始我遇到了错误 The function/feature is not implemented (Odd-size DCT's are not implemented
我正在尝试使用 AFNetworking 的 AFPropertyListRequestOperation,但是当我尝试下载它时,出现错误 预期的内容类型{( “应用程序/x-plist” )}, 得
我在下面收到错误。我知道这段代码的意思,但我不知道界面应该是什么样子: Element implicitly has an 'any' type because index expression is
我尝试将 SignalType 从 ReactiveCocoa 扩展为自定义 ErrorType,代码如下所示 enum MyError: ErrorType { // .. cases }
我无法在任何其他问题中找到答案。假设我有一个抽象父类(super class) Abstract0,它有两个子类 Concrete1 和 Concrete1。我希望能够在 Abstract0 中定义类
我想知道为什么这个索引没有用在 RANGE 类型中,而是用在 INDEX 中: 索引: CREATE INDEX myindex ON orders(order_date); 查询: EXPLAIN
我正在使用 RxJava,现在我尝试通过提供 lambda 来订阅可观察对象: observableProvider.stringForKey(CURRENT_DELETED_ID) .sub
我已经尝试了几乎所有解决问题的方法,其中包括。为 提供类型使用app.use(express.static('public'))还有更多,但我似乎无法为此找到解决方案。 index.js : imp
以下哪个 CSS 选择器更快? input[type="submit"] { /* styles */ } 或 [type="submit"] { /* styles */ } 只是好
我不知道这个设置有什么问题,我在 IDEA 中获得了所有注释(@Controller、@Repository、@Service),它在行号左侧显示 bean,然后转到该 bean。 这是错误: 14-
我听从了建议 registering java function as a callback in C function并且可以使用“简单”类型(例如整数和字符串)进行回调,例如: jstring j
有一些 java 类,加载到 Oracle 数据库(版本 11g)和 pl/sql 函数包装器: create or replace function getDataFromJava( in_uLis
我已经从 David Walsh 的 css 动画回调中获取代码并将其修改为 TypeScript。但是,我收到一个错误,我不知道为什么: interface IBrowserPrefix { [
我是一名优秀的程序员,十分优秀!