2013-10-09 70 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的合同。 –