ocaml проблемы с вложенными функциями и переменными - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь установить ограничение функции, которое бы ограничивало значения таблицы в соответствии со столбцами, имеющими значение [значение].Моя идея состоит в том, чтобы создать список, состоящий из истинных и ложных значений для столбца, которые удовлетворяют условному столбцу и значениям параметров.Позже рекурсивное сопоставление выберет столбцы, а функция создателя списка создаст новый столбец в соответствии с настоящим списком ложных значений.

Когда дело доходит до хранения в ocaml-вложенных переменных, позвольте ... в области видимости я очень запутался.Что не так с кодом ниже?

let rec restrict (column, value, aTable) = match aTable with
    name,[]->[]
  |name,(col,vals)::rest->if col=column
      then (col,auxListMaker(vals,trueFalseList))::restrict (column,value.(name,rest))
      else restrict (column,value.(name,rest))

let rec auxTrueFalser (column, value, aTable) = match aTable with 
    name,[]->[]
  |name,(col,vals)::rest-> if column=col 
      then (if List.hd vals = value 
            then true::aux1(column,value,(name,[(col,List.tl vals)]))
            else false::aux1(column,value,(name,[(col,List.tl vals)])))
      else aux1(column,value,(name,rest)) 
in 

let trueFalseList =  auxTrueFalser (column, value, aTable) in

let rec auxListMaker (vals, trueFalseList) = match vals with
    []->[]
  |h::t -> if List.hd trueFalseList
      then h::auxListMaker(t,List.tl trueFalseList)
      else auxListMaker(t,List.tl trueFalseList)
in

1 Ответ

0 голосов
/ 15 мая 2018

Главное, что нужно осознать, - это два варианта использования let.Первая форма используется для определения значений в модуле и должна отображаться на самом внешнем уровне модуля.Это выглядит так:

let name = expression

В качестве удобного синтаксиса вы можете определить функцию на самом внешнем уровне, например так:

let name arg = expression

Другая форма let может появляться где угоднои используется для определения локальной переменной.Это выглядит так:

let name = expression1 in expression2

Это устанавливает name как локальную переменную со значением, заданным expression1.Область имени (где оно может использоваться): expression2.

Опять же, в качестве удобного синтаксиса, вы можете определить локальную функцию следующим образом:

let name arg = expression1 in expression2

Это выглядитдля меня, например, auxListMaker и auxTrueFlser должны быть локальными функциями, определенными внутри restricttrueFalseList должно быть локальным (нефункциональным) значением.Таким образом, форма restrict будет выглядеть примерно так:

let rec restrict (column, value, aTable) =

    let auxTrueFalser (column, value, aTable) =
        ...
    in

    let auListMaker (vals, trueFalseList) =
        ...
    in

    let trueFalseList = auxTrueFalser (column, value, aTable) in

    ... (* body of restrict *)

В этом макете restrict определяется на верхнем уровне (то есть просто с let, без in).Другие имена являются локальными переменными (значениями и функциями) и поэтому определяются с помощью let ... in.

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

Обновление

Ответы на дополнительные вопросы.

Область действия первой формы let(без in) - остальная часть модуля.В обычном случае простого исходного файла .ml это означает остальную часть файла.

Да, функция restrict, показанная в приведенном выше схематическом макете, повторно оценит значение для trueFaleList прикаждый рекурсивный вызов.

Если вы работаете в терминале, о котором OCaml знает, это подчеркивает место, где он считает, что у вас есть синтаксическая ошибка.Синтаксис первых нескольких строк приведенного выше схематического макета вполне понятен.Вам нужно будет показать свой код (или наименьшее автономное подмножество, которое показывает проблему) и конкретное сообщение об ошибке, которое вы получили.

...