我目前正在阅读软件基础一书.当定义定义时,我经常会看到一些含义链,我相信连词会更有意义.例如,在定义鸽笼原则时,作者写道:
Theorem pigeonhole_principle: ?{X:Type} (l1 l2:list X),
excluded_middle ?
(?x, appears_in x l1 ? appears_in x l2) ?
length l2 < length l1 ?
repeats l1.
Run Code Online (Sandbox Code Playgroud)
如果看起来更像这样,那么这个定义对我来说会更有意义:
Theorem pigeonhole_principle: ?{X:Type} (l1 l2:list X),
(excluded_middle /\
(?x, appears_in x l1 ? appears_in x l2) /\
length l2 < length l1) ?
repeats l1.
Run Code Online (Sandbox Code Playgroud)
为什么第一个版本正确?为什么连词不合适?
这只是一个例子.更一般地说,我在问为什么连词似乎被避开以支持coq中的含义链.
是否有在Coq标准库中对自然进行欧几里德划分的功能?我一直找不到.如果没有,那么在数学上是否有理由不应该有一个?
我想要这个的原因是因为我试图将列表拆分成两个较小的列表.我希望一个列表大约是另一个列表的一半,所以我计算(长度xs)/ 2.
我试图在rails控制器规范中重用一些常用代码.对于管理员用户和普通用户,我有不同的上下文.但是,对于特定操作,大部分行为都是相同的,所以我尝试将该常见行为拉出到辅助函数中:
describe SomeController do
def common_get_new
# common stuff
end
context "regular users" do
describe "GET new" do
common_get_new
end
end
context "admin users" do
describe "GET new" do
common_get_new
end
end
end
Run Code Online (Sandbox Code Playgroud)
这给了我错误:
undefined局部变量或方法`common_get_new'
我究竟做错了什么?
使用Mockito,是否可以使用间谍或模拟来验证函数是否被调用/未调用,而不提供实际参数?例如,如果我有一个类或对象:
class MyClass{
def f(x : Int) = x
}
object MyObject{
def f(x : Int) = x
}
Run Code Online (Sandbox Code Playgroud)
我想能够说出类似的话:
val my_class = mock[MyClass]
// Do something that causes method f of MyClass to be called
there was one(my_class).f // Doesn't give arguments
val my_object = spy(MyObject)
// Do something that causes method f of MyObject to be called
there was one(my_object).f // Doesn't give arguments
Run Code Online (Sandbox Code Playgroud)
我只是想验证方法是否被调用,而不是它接收到特定的参数.此外,当我检查没有调用函数时:
there was no(my_object).f
Run Code Online (Sandbox Code Playgroud)
我不想验证它是不是用某些参数调用的,而是根本没有调用它.
有没有办法做到这一点?
我希望有一个Nat保持在固定范围内.我想要功能,如果他们要将数字推到范围之外incr,decr那就失败了.这似乎是一个很好的用例Fin,但我不确定如何使其工作.类型签名可能如下所示:
- Returns the next value in the ordered finite set.
- Returns Nothing if the input element is the last element in the set.
incr : Fin n -> Maybe (Fin n)
- Returns the previous value in the ordered finite set.
- Returns Nothing if the input element is the first element in the set.
decr : Fin n -> Maybe (Fin n)
Run Code Online (Sandbox Code Playgroud)
在Nat将被用于索引成Vect n.我如何实现incr …
我正在尝试编写一个带有mSmallest两个自然数的函数,n并m作为输入并生成一个向量.输出向量包含具有m成员的有限集的最小n成员.
例如mSmallest 5 3,应该生产[FS (FS Z), FS Z, Z]哪个是Vect 3 (Fin 5)
我想限制输入参数m小于n.我试过这样的事情:
mSmallest : (n : Nat) -> (m : Nat) -> {auto p : n > m = True} -> Vect m (Fin n)
mSmallest Z Z = ?c_3
mSmallest Z (S k) = ?c_5
mSmallest (S k) m = ?c_2
Run Code Online (Sandbox Code Playgroud)
由于输入,第二种情况不可能p.如何做到这样才能Z (S k)消除案件?
另外,有更好的方法来定义 …
在natToFin从标准库函数具有以下特征:
natToFin : Nat -> (n : Nat) -> Maybe (Fin n)
Run Code Online (Sandbox Code Playgroud)
natToFin 4 5返回Just (FS (FS (FS (FS FZ)))) : Maybe (Fin 5),同时
natToFin 5 5返回Nothing.
我想要一个具有以下签名的函数:
myNatToFin : (m : Nat) -> (n : Nat) -> { auto p : n `GT` m } -> Fin n
Run Code Online (Sandbox Code Playgroud)
它的行为一样的标准库函数,但并不需要返回Maybe,因为它总是能够产生一个Fin n从m考虑到n大于m.
我该如何实施myNatToFin?
我有一系列用管道链接在一起的命令:
should_create_one_line | expects_one_line
第一个命令should_create_one_line应该生成只有一行的输出,但在奇怪的情况下,输出可能是多行或空。
我想在这两者之间添加一个步骤validate_one_line:
should_create_one_line | validate_one_line | expects_one_line
如果其输入恰好包含 1 行,validate_one_line则将简单地输出其输入。如果其输入包含多于 1 行或为空,validate_one_line则应导致整个步骤序列停止并返回错误代码。
我可以使用什么命令validate_one_line?
我想知道是否可以使用WebSharper编译器在F#中编写Node.js应用程序.有没有可用的资源可以告诉我如何做到这一点?有没有充分的理由不尝试这样做?
这两个记录具有相同的字段,具有相同的值,但顺序不同:
val person1 = ("age" ->> 34) :: ("name" ->> "Jane") :: HNil
val person2 = ("name" ->> "Jane") :: ("age" ->> 34) :: HNil
Run Code Online (Sandbox Code Playgroud)
当我使用时,这些被认为是相等的,==因为字段的顺序是不同的.它们是HLists,所以在检查相等性时,顺序对我来说是有意义的,但我觉得彼此排列的记录应该是平等的.我也觉得他们应该有相同的类型,但他们没有,因为他们是HList.
有没有办法让记录的值和类型相等,更像我期望的行为?另外,这种方式实施的原因是什么?可以HMap使用吗?
idris ×3
coq ×2
scala ×2
bash ×1
code-reuse ×1
f# ×1
javascript ×1
mockito ×1
node.js ×1
rspec ×1
sh ×1
shapeless ×1
shell ×1
specs2 ×1
websharper ×1