Статическая проверка типов условий

1

Ниже приведен код для проверки типа 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))
  • 1
    Ваша самая насущная необходимость состоит в том, чтобы использовать больше места в вашем отступе
  • 0
    возможный дубликат определения типа typeConditional
Теги:
conditional

2 ответа

1

Пожалуйста, будьте предельно конкретны в отношении того, какие входные данные получают ваши функции, и каковы результаты, которые они должны генерировать. Это очень важно! Поскольку вы не были конкретны, любой, кто пытается помочь вам, должен угадать, что вы хотите сделать.


Из вашего утверждения:

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
1

Для такого случая я обычно стараюсь начинать с простых выражений, а затем строить до более сложных:

def typeConditional(expr, env):
  # handle a literal
  # handle a variable

тогда подумайте о том, как разбить более сложные случаи на состав более простых случаев...

Также, когда вы пишете тесты, вы можете заказать их от простых до сложных, чтобы вы могли просто работать через них по очереди.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню