表达正常的数据类型(如列表和nat)非常简单,并且有很多例子.但是,翻译GADT的通用程序是什么?将典型类型(如Vector和依赖产品)从Idris转换为Morte的一些示例将非常具有说明性.
这似乎是不可能提取西格玛在第二元件上构式的演算。此外,似乎没有已知的简单方法可以在不失去一致性的情况下扩展具有依赖消除的构造演算。因此,如何利用一个简单但不一致的公理(例如Type : Type或不受限制的递归,例如?)来提取 Sigma 的第二个元素?
也就是说,给定以下 Sigma 构造函数:
Sigma =
? A : *
? B : A -> *
? a : A
? b : B
? Data : *
? Sigma :
? fst : A
? snd : B fst
Data
Sigma a b
Run Code Online (Sandbox Code Playgroud)
在等价于构造演算的语言中,除了使用Type : Type或其他一些简单的不一致公理外,是否有可能实现一个函数,给定一个项,如Sigma Nat (\x -> Nat) 3 6,提取第二个值,6?
而不是在文件系统上使用Agda(使用EMACS,终端等),是否可以直接从Haskell使用它作为库?例如:
-- UsingAgda.hs
import Agda
-- Prints the type of a term on some Agda code
main :: IO ()
main = typeOf "true" agdaCode where
agdaCode :: String
agdaCode = unlines
["module Hello where "
," "
,"data Bool : Set where"
," true : Bool "
," false : Bool "]
Run Code Online (Sandbox Code Playgroud)
上面的代码会输出Bool,因为true : Bool在那个Agda代码上.
从Rust书中关于所有权的章节,可以通过转移所有权或使用可变或不可变引用将不可复制的值传递给函数.当您转移值的所有权时,它不能再用于原始函数:如果您愿意,必须将其返回.传递引用时,您可以借用该值并仍然可以使用它.
我来自默认值不可变的语言(Haskell,Idris等).因此,我可能永远不会考虑使用引用.在两个地方拥有相同的价值对我来说是危险的(或者至少是尴尬的).由于引用是一个功能,因此必须有理由使用它们.
有没有情况我应该强迫自己使用参考?这些情况是什么?为什么它们有益?或者他们只是为了方便和默认通过所有权是好的?
Representing, for example, the STLC in Agda can be done as:
data Type : Set where
* : Type
_?_ : (S T : Type) ? Type
data Context : Set where
? : Context
_,_ : (? : Context) (S : Type) ? Context
data _?_ : Context ? Type ? Set where
here : ? {? S} ? (? , S) ? S
there : ? {? S T} (i : ? ? S) ? (? , T) …Run Code Online (Sandbox Code Playgroud) 假设我在 Rust 中有以下类型:
type UnOp = fn(u64) -> u64;
Run Code Online (Sandbox Code Playgroud)
该类型允许我创建不同的一元运算:
const add1 : UnOp = |x| x + 1;
const mul2 : UnOp = |x| x * 2;
Run Code Online (Sandbox Code Playgroud)
现在,假设我需要在代码的不同位置使用add2, add3, (...), 来表示不同的数字。add4编写所有定义会很麻烦,因此,我编写了一个通用adder函数:
fn adder(add : u64) -> UnOp {
|x| x + add
}
Run Code Online (Sandbox Code Playgroud)
这将允许我为任何数字写add(2)、add(3)等:
// Prints 2 + 40
println!("result is: {}", adder(2)(40))
Run Code Online (Sandbox Code Playgroud)
问题是:adder实际上不是有效的 Rust 代码,因为它|x| ...是一个闭包,而不是静态函数。为了按照adder我想要的方式工作,我需要修改UnOp为闭包:
type UnOp = …Run Code Online (Sandbox Code Playgroud) function myFunction() {
wait(); //what I put there?
return;
}
myFunction();
//this is an event; when its triggered I want function to resume
onSomething = function() {
myFunction.resume(); //what I put there?
}
Run Code Online (Sandbox Code Playgroud)
它只是一个本地的经验.请注意,虽然(!resume)不起作用,因为这会阻止onSomething事件发生.
有人能给我指导在动作脚本上创建一个简单的网络摄像头聊天吗?闪存已经有了网络摄像头对象吗?我如何在两个客户端之间交换视频流?
有些语言实现了散列表,它可以使用任何东西,而不仅仅是字符串作为键.在JavaScript中,您只能使用字符串和数字.这种实现的查找仍然是O(1)吗?JavaScript中是否有实现?
我想用一个非常短的语法编写一个DSL,我注意到两个对编程,函数和散列非常重要的东西.这是我的设计:
创建哈希:
(a:1 b:2 c:3)
Same as JavaScript's: {a:1,b:2,c:3}
Run Code Online (Sandbox Code Playgroud)
创建有序哈希,省略键:
(x y 5)
Same as JavaScript's: {0:'x', 1:'y', 2:5}
Run Code Online (Sandbox Code Playgroud)
创建一个匿名函数:
(a?)
Same as JavaScript's: (function(x){ return x.a; })
Example application:
((test a? b?) (a:1 b:2 c:3))
>> Outputs (test 1 2)
Run Code Online (Sandbox Code Playgroud)
嵌套函数:
(a? a?')
Same as JavaScript's: (function(obj1){ return function(obj2) { return [obj1.a,obj2.a]; }; })
Example double-application:
(((a? a?') (a:1)) (a:2))
Is reduced to: ((1 a?) (a:2))
Then outputs: (1 2)
Run Code Online (Sandbox Code Playgroud)
什么语言适合这种DSL的实现?