我正在使用Haskell和QuickCheck为以下函数编写测试:
{-| Given a list of points and a direction, find the point furthest
along in that direction. -}
fn :: (Eq a, Ord a, DotProd a) => [a] -> a -> a
fn pnts dir = pnts !! index
where index = fromJust $ elemIndex (maximum dotproducts) dotproducts
dotproducts = map (dot dir) pnts
Run Code Online (Sandbox Code Playgroud)
我相信这个实现是正确的,因为它不是太复杂的功能.但是,我想使用QuickCheck来测试一些边缘情况.
但是,我遇到的问题是,当我定义我的QuickCheck测试时,它们与我正在测试的功能相同.
如何在QuickCheck中编写一个测试功能目的而不重复实现的测试?
这个问题与MVC(模型 - 视图 - 控制器)有关.我的模型当前使用Java中的Observer/Observable模式更改了我的View:
public class Model extends Observable {
}
public class View implements Observer {
@Override
public void update(observable o, Object obj) {
// ... update the view using the model.
}
}
Run Code Online (Sandbox Code Playgroud)
这很好用.但是,我的模型变得越来越复杂 - 它开始保持其他类的列表:
public class Model extends Observable {
List<Person> people = new ArrayList<Person>();
}
public class Person {
private String name = "";
// ... getter / setter for name
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:当一个人的名字发生变化时,我想更新一个包含该人的模型的视图.我能想到的唯一方法是让Model实现一个Observer类,让Person扩展一个Observable类.然后,当Person改变时,他会通知他的观察者(包括父模型).
然而,如果我的模型变得复杂,这似乎很多工作.是否有更好的方法可以对父模型进行"冒泡"更改?
我正在尝试创建一个由几种不同类型组成的游戏引擎:
data Camera = Camera ...
data Light = SpotLight ... | DirectionalLight ...
data Object = Monster ... | Player ... | NPC ...
Run Code Online (Sandbox Code Playgroud)
但是,我现在正在尝试为所有这些实体实现基本物理.这要求它们各自包含a pos :: (Double, Double, Double)和a velocity :: (Double, Double, Double).
在面向对象的语言中,我将它实现为:
Camera implements PhysicalObject
Run Code Online (Sandbox Code Playgroud)
其中PhysicalObject包含两个属性pos和velocity.
我的直接反应是将它们全部放在同一类型中:
data Object = Monster ... | Player ... | NPC ... | Camera ...
Run Code Online (Sandbox Code Playgroud)
然而,我担心这可能会使得实现特定于摄像机的功能,特定于灯光的功能等变得困难.实际上,除了它们在世界上都具有物理位置和速度这一事实之外,它们几乎没有其他共同点. .
有没有比在每个类型构造函数中定义两个属性更简单的方法?
我有许多字符串(字符集合)代表不同语言的句子,例如:
你好,我的名字是乔治.
Das brot ist gut.
...等
我想分配每个分数(从0 ... 1),表明它们是英语句子的可能性.是否有可接受的算法(或Python库)来执行此操作?
注意:我不在乎英语句子的语法是否完美.
我有一个.xml表示形状和5个drawable-***文件夹的文件(对于hdpi,ldp,mdpi,xhdpi,xxhdpi).
由于这是一个形状,我假设我只需要一个副本?我应该创建一个名为drawable的文件夹并将其放在那里吗?或者我是否需要每个分辨率特定文件夹中的一个形状副本?
给出两个列表:
a = [[1,2],[3,4]]
b = [[1,2],[3,4]]
Run Code Online (Sandbox Code Playgroud)
我怎么写compare这样的:
compare(a,b) => true
Run Code Online (Sandbox Code Playgroud) 我在一个项目中使用Numpy和Python,其中2D地图由以下表示ndarray:
map = [[1,2,3,4,5],
[2,3,4,2,3],
[2,2,2,1,2],
[3,2,1,2,3],
[4,6,5,7,4]]
MAP_WIDTH = 5, MAP_HEIGHT = 5
Run Code Online (Sandbox Code Playgroud)
一个对象有一个元组位置:
actor.location = (3,3)
Run Code Online (Sandbox Code Playgroud)
和视图范围:
actor.range = 2
Run Code Online (Sandbox Code Playgroud)
如何编写函数actor.view_map(map),以便地图返回演员位置周围的区域,直到范围.例如(使用上面的地图),
range = 1
location = (3, 2)
=>
[[2,3,4],
[3,4,2],
[2,2,1]]
Run Code Online (Sandbox Code Playgroud)
但如果演员的范围延伸得太远,我希望地图填充-1:
range = 1
location = (1,1)
[[-1,-1,-1],
[-1, 1, 2],
[-1, 2, 3]]
Run Code Online (Sandbox Code Playgroud)
最简单的情况是0的范围,它返回当前的方块:
range = 0
location = (1, 2)
[[2]]
Run Code Online (Sandbox Code Playgroud)
如何将地图切割到某个边界?
具体来说,我正在谈论本次比赛的编程:http://www.nodewar.com/about
比赛涉及到你在二维世界中与其他团队一起拥有一群宇宙飞船.船只受到边界的约束(如果它们退出它们死亡),它们必须不断地避开卫星(他们用重力拉动船只).目标是杀死对方女王.
我试图编写一些相对基本的技术,但我觉得我错过了一些基本的东西.
例如,我实现了一些boids行为(http://www.red3d.com/cwr/boids/),但它们似乎缺少...目标,可以这么说.
对于这种游戏,是否有任何常用技术(或者,最好是技术组合)?
编辑
我想以赏金再次打开这个,因为我觉得我仍然缺少重要的信息.以下是我的NodeWar代码:
boundary_field = (o, position) ->
distance = (o.game.moon_field - o.lib.vec.len(o.lib.vec.diff(position, o.game.center)))
return distance
moon_field = (o, position) ->
return o.lib.vec.len(o.lib.vec.diff(position, o.moons[0].pos))
ai.step = (o) ->
torque = 0;
thrust = 0;
label = null;
fields = [boundary_field, moon_field]
# Total the potential fields and determine a target.
target = [0, 0]
score = -1000000
step = 1
square = 1
for x in [(-square + o.me.pos[0])..(square + o.me.pos[0])] …Run Code Online (Sandbox Code Playgroud) 什么阻止像C这样的语言使用Lisp宏?在编译过程中的什么时候,C放弃了操纵其代码树的能力?
而且,这是一个特别是解释与编译的问题吗?
我正在尝试编写一个函数
getColumn :: Int -> Vector n e -> e
Run Code Online (Sandbox Code Playgroud)
从大小的向量中检索第i个项目n.
这些向量定义如下:
data Natural where
Zero :: Natural
Succ :: Natural -> Natural
type One = Succ Zero
type Two = Succ One
type Three = Succ Two
type Four = Succ Three
data Vector n e where
Nil :: Vector Zero e
(:|) :: e -> Vector n e -> Vector (Succ n) e
infixr :|
Run Code Online (Sandbox Code Playgroud)
是否有某种方法来编写getColumn函数,如果编译器的大小Int太大,编译器将拒绝代码Vector?
我该怎么写这个函数?