2013-10-09 41 views
2

我在学习人工智能球拍的球拍。对于第一个项目,老师给我们提供了一个包含合同和单元测试的文件,我们将编写使其运行所需的函数。我刚刚创建的,我需要的功能存根,并会见了所有的合同,除了一个:球拍合同和结构问题

[start-state (and/c state? (not/c state-game-over?))] 

我声明看起来像这样的时刻功能:

(define (start-state) 
    (state '() start-tiles 0) 
) 

和国家结构是由给定老师:

(struct state (played unplayed passes) #:prefab) 

合同:

[struct state ((played (listof (and/c tile? tile-at-origin?))) 
      (unplayed (listof (and/c tile? tile-on-board?))) 
      (passes pass-count?))] 

这崩溃,出现错误:

start-state: broke its contract 
promised: (and/c state? (not/c state-game-over?)) 
produced: #<procedure:start-state> 
which isn't: state? 
in: (and/c state? (not/c state-game-over?)) 
contract from: 

我相信我的启动状态过程将创建并返回一个状态结构,但显然它返回自身,违反了合同。如何返回结构而不是程序?

回答

3

看起来像start-state不应该是一个过程,而是一个值。也就是说,你需要做的

(define start-state (start ...)) 

代替

(define (start-state) ...) 
+0

这解决了这个问题。谢谢!你如何知道合同中的程序和价值之间的区别?我不习惯它,对我来说,所有提供的合同看起来都是一样的,所以我认为所有的程序都是。 – gamda

+1

通常,函数的契约将使用' - >'。例如'( - > integer?boolean?)'是一个函数,它需要一个'integer?'并返回一个'boolean?'。您也可以使用点符号读取器技巧来编写它的中缀,如下所示:'(integer?。 - >。boolean?)'。当然,你可能有一个命名合约,它是一个' - >'合约的别名或包装,但是在底部它将是' - >'(或者像' - > *'的箭头的一些变体)。 –

+0

感谢您的支持,@GregHendershott!我知道如何解决“程序vs(非程序)价值”的问题,但我之前没有使用过Racket的合同。 –