2014-12-05 3 views
1

Я пытаюсь решить упражнение в SML;Имея проблему с записями и кортежами в SML

Напишите программу ML, которая будет использоваться для экзамена по множественному выбору, содержащего 10 вопросов. Ваша программа должна включать следующее:

o Ответный ключ экзамена , например.

val key= “adabcbaadb”; 

o Определение типа записи (информации), которая содержит имя и ответы студента. , например. {name=”Ali”,ans=”abadccdadb”}

o Определение типа для кортежа (результата), который содержит имя и оценку ученика. , например. ("Ali",60)

o Напишите как можно больше функций для записи списка записей типа, содержащих информацию 3 учеников, вычислить их оценки и преобразовать их в список кортежей результата типа. Вы также можете написать другие вспомогательные функции

например.

- val stuInfo:info list=[{name=”Ali”,ans=”abadccdadb”}, 
          {name=”Ege”,ans=”cbbdacabda”}, 
          {name=”Can”,ans=”adabcbaadb”}]; 

     - val results = calculate(stuInfo); 
val results = [("Ali",60),("Ege",20),("Can",100)] : result list 

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

-val aboveList=aboveAvg(results); 
     val aboveList = [("Ali",60),("Can",100)] : result list 

Примечания:  Убедитесь, что вы даете типы ваших параметров и возвращаемого значения во всех ваших функций.  Объясните свои выражения.  Используйте функцию разрыва, которая преобразует строку в массив символов , например.

- explode "abc"; 
     val it = [#"a",#"b",#"c"] : char list 

Мой письменный код для этого упражнения приведен ниже; но мой код не работает:/Где моя ошибка?

val answer_key="ddacbadbca"; 
type student_information={s_name:string,s_choice:string}; 
type student_result=string*int; 
val student:info list=[{s_name="David",s_choice="adcbbaccad"},{s_name="John",s_choice="ccdabdbbcc"},{s_name="Alice",s_choice="abdaccacdb"}]; 
val 3studentsResult:student_result=average(student_information); 
fun average ((h::t):student_information list):student_result list=student_score(explode"#ans h",explode"key")::average(t); 
val sum=0; 
fun student_score(((a::b,c::d):'a list):'a list) = (if(a=c) then sum=sum+10 else sum=sum+0)::student_score(b,d); 

Благодаря

ответ

1

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

val answer_key = "ddacbadbca"; 

type student_information = {s_name:string, s_choice:string}; 
type student_result = string * int; 

val student : student_information list = 
    [{s_name="David", s_choice="adcbbaccad"}, 
    {s_name="John", s_choice="ccdabdbbcc"}, 
    {s_name="Alice", s_choice="abdaccacdb"}]; 

Вы также можете сохранить переменную и имена типов согласованы. Я считаю, что соглашение должно использовать случай змеи (например, snake_case) для имен типов и верблюжьего корпуса (например, camelCase) для имен переменных и функций.

Вот некоторые из ваших фактических ошибок:

Для вашего student переменной, вы даете тип info list, который не существует в вашей программе. Я предполагаю, что ваша переменная student_information используется для обозначения info, поэтому вы должны изменить одну из них на другую.

У вас есть переменная с именем 3studentsResult. Переменные не могут начинаться с цифр, они должны начинаться с букв. Вы должны переименовать эту переменную, что-то вроде threeStudentsResult.

В переменной 3studentsResult вы используете функцию average, которую вы определяете позже. Это не работает в стандартном ML. Вы должны определить функцию перед ее использованием. (Если вам не нужна взаимная рекурсия, вы можете использовать ключевое слово and, но это не имеет отношения к вашей проблеме.) Поэтому определите average до 3studentsResult и определите student_score до average.

Даже после их фиксации ваша функция student_score неверна. Я предполагаю, что sum=sum+10 означает, что вы пытаетесь изменить значение sum, как и на императивном языке программирования. Однако Standard ML является функциональным языком, и переменные значения переменных - это то, чего вам следует избегать в функциональном программировании. Фактически, когда я говорю о «переменных» в SML, я имею в виду объявления значений, которые нельзя изменить. Я рекомендую вам немного подумать о своей проблеме, и, возможно, вы можете разделить свою проблему на подзадачи. Удачи.