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的合同。 –