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:
我相信我的启动状态过程将创建并返回一个状态结构,但显然它返回自身,违反了合同。如何返回结构而不是程序?
这解决了这个问题。谢谢!你如何知道合同中的程序和价值之间的区别?我不习惯它,对我来说,所有提供的合同看起来都是一样的,所以我认为所有的程序都是。 – gamda
通常,函数的契约将使用' - >'。例如'( - > integer?boolean?)'是一个函数,它需要一个'integer?'并返回一个'boolean?'。您也可以使用点符号读取器技巧来编写它的中缀,如下所示:'(integer?。 - >。boolean?)'。当然,你可能有一个命名合约,它是一个' - >'合约的别名或包装,但是在底部它将是' - >'(或者像' - > *'的箭头的一些变体)。 –
感谢您的支持,@GregHendershott!我知道如何解决“程序vs(非程序)价值”的问题,但我之前没有使用过Racket的合同。 –