UPDATE
私は完全にあなたがあなたの例ではand
ないand/c
を使用することを逃しました。これを試してみてください :
#lang racket
(define/contract (listofOne n)
(-> (and/c integer? positive?) (listof integer?))
(cond
((= n 0) '())
(else (cons 1 (listofOne (- n 1))))))
(listofOne 12.5)
結果:
listofOne: contract violation
expected: integer?
given: 12.5
in: an and/c case of
the 1st argument of
(->
(and/c integer? positive?)
(listof integer?))
contract from: (function listofOne)
blaming: anonymous-module
(assuming the contract is correct)
at: unsaved-editor:2.18
SECOND UPDATEここ
はand
の説明です。
形態
(and c1 c2)
手段:
1. Evaluate `c1` giving a value `v`
2. If the value `v1` is false,
then the result of the `and`-expression is false.
(note that `c2` is not evaluated)
3. If the value `v1` is non-false,
then evaluate the expression `c2` giving a value `v2`.
4. The result of the and-expressions is v2.
注:c1が真と評価された場合、その後(and c1 c2)
はc2
と同じ結果を与えます。 これは、特にc1
が契約(これは偽値ではない)である場合、 である場合、(and c1 c2)
はc2
と同じ結果をもたらすことを特に意味します。
(and integer? positive?)
の例では、positive?
と同じ結果が得られます。
(-> (and integer? positive?) (listof integer?))
が(-> positive? (listof integer?))
と同じ働きをしていることにも注意してください。コードで
:あなたは私たちは異なるアプローチを必要とする両方のc1
とc2
を使用する契約を締結したいので
(and c1 c2)
が
(let ([v1 c1])
(if v1
(let ([v2 c2])
v2)
#f))
と同じです。 2つの述語を単純述語に結合する方法を調べてみましょう。ない述語自身に -
(and/p p1 p2)
は述語によって返された値に使用されている。ここ
(lambda (x)
(and (p1 x) (p2 x)))
and
のために短くする必要があります。
コンストラクトand/c
はand/p
と同様に機能しますが、コントラクトの表現は述語よりも複雑です。しかし、原則は同じです。
は
(let ([t c1])
(if t
t
c2))
の略で、/境界を渡すcはいますか?私は/ cと契約違反をします。私は約10回の説明を読みましたが、それが何であるのかまだ分かりません。 –
申し訳ありません契約で 'と/ c 'の代わりに'と 'を使ったことを忘れてしまった。 – soegaard
私はそれが/ cと動作するのを見ますが、なぜ...?なぜそれはうまくいかないのですが、それはなぜですか? –