Struct 球拍合同与结构问题

Struct 球拍合同与结构问题,struct,racket,contract,Struct,Racket,Contract,我正在为一个人工智能班学习球拍。对于第一个项目,老师给了我们一个包含合同和单元测试的文件,我们要编写使其运行所需的函数。我刚刚创建了我需要的函数存根,并满足了除一个以外的所有合同: [start-state (and/c state? (not/c state-game-over?))] 我声明的函数目前如下所示: (define (start-state) (state '() start-tiles 0) ) 教师给出了状态结构: (struct state (played unpl

我正在为一个人工智能班学习球拍。对于第一个项目,老师给了我们一个包含合同和单元测试的文件,我们要编写使其运行所需的函数。我刚刚创建了我需要的函数存根,并满足了除一个以外的所有合同:

[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: 
开始状态:违反其合同
承诺:(和/c状态?(不是/c状态游戏结束?)
制作:#
哪个不是:州?
在:(和/c状态?(不是/c状态游戏结束?)
合同来自:

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

看起来启动状态不应该是过程,而是值。也就是说,你需要这样做

(define start-state (start ...))
而不是

(define (start-state) ...)

这就解决了问题。非常感谢。你如何知道合同中的程序和价值之间的区别?我还不习惯它,对我来说,所有提供的契约看起来都是一样的,所以我假设一切都是过程。通常函数的契约将使用
->
。例如,
(->integer?boolean?
是一个函数,它需要一个
整数?
并返回一个
布尔?
。您还可以使用点符号读取器技巧将其写为中缀,如下所示:
(整数?->.boolean?
)。当然,您可能有一个命名的契约,它是
->
契约的别名或包装器,但在底部它将是
->
(或一些类似
->*
的箭头变体)。感谢您的来电,@GregHendershott!我知道如何解决“程序与(非程序)价值”的问题,但我以前从未使用过Racket的合同。哇,这让合同更容易理解!谢谢你的帮助@GregHendershott