Ниже приведен код для проверки типа StaticCharme:
Мне нужна помощь, определяющая метод typeConditional (expr, env). Необходимо проверить, что все предикатные выражения оцениваются по логическому значению. Чтобы условное выражение было корректным, последующие выражения каждого предложения производят значения одного и того же типа. Тип условного выражения является типом всех последующих выражений.
У меня уже есть метод typcheck (expr, env):
def typecheck(expr, env):
if isPrimitive(expr):
return typePrimitive(expr)
elif isConditional(expr):
return typeConditional(expr, env)
elif isLambda(expr):
return typeLambda(expr, env)
elif isDefinition(expr):
typeDefinition(expr, env)
elif isName(expr):
return typeName(expr, env)
elif isApplication(expr):
return typeApplication(expr, env)
else: evalError ("Unknown expression: " + str(expr))
Пожалуйста, будьте предельно конкретны в отношении того, какие входные данные получают ваши функции, и каковы результаты, которые они должны генерировать. Это очень важно! Поскольку вы не были конкретны, любой, кто пытается помочь вам, должен угадать, что вы хотите сделать.
Из вашего утверждения:
In order for a conditional expression to be type correct:
a) All predicates must be boolean
b) All consequents must have the same type
If it typechecks:
The type of the conditional expression
is the type of the consequent expressions.
Это переводится почти непосредственно в (псевдо) код:
def typeConditional(condition, env):
#receives a conditional expression, and an execution environment
# returns the expression type if it is well typed
# or None otherwise
predicates = get_predicate_expressions(condition)
if any predicate has a type that is not Bool:
return None
else:
consequents = consequent_expressions(consition)
the_type = typcheck(first consequent, env)
if all consequents have type the_type:
return the_type
else:
return None
Для такого случая я обычно стараюсь начинать с простых выражений, а затем строить до более сложных:
def typeConditional(expr, env):
# handle a literal
# handle a variable
тогда подумайте о том, как разбить более сложные случаи на состав более простых случаев...
Также, когда вы пишете тесты, вы можете заказать их от простых до сложных, чтобы вы могли просто работать через них по очереди.