在SML中遇到记录和元组的问题

时间:2014-12-05 16:15:57

标签: tuples sml records smlnj

我正在尝试解决SML中的练习,如;

编写一个ML程序,用于包含10个问题的多项选择考试。您的计划应包括以下内容:

o考试的答案键      例如

  val key= “adabcbaadb”;

o记录(信息)的类型定义,其中包含学生的姓名和答案。      例如{name=”Ali”,ans=”abadccdadb”}

o元组(结果)的类型定义,其中包含学生的姓名和分数。 例如("Ali",60)

o根据需要编写尽可能多的函数,以获取包含3名学生信息的类型信息记录列表,计算他们的分数,并将其转换为结果类型元组列表。您也可以编写其他支持功能

e.g。

-  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

o根据需要编写尽可能多的函数来计算平均分数,并返回得分高于平均分的学生。       例如

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

注意: 确保在所有功能中提供参数类型和返回值。 对表达式进行Paranthesize。 使用explode函数将字符串转换为字符数组          例如

 - 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 个答案:

答案 0 :(得分: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(如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的值,就像您在命令式编程语言中所做的那样。但是,标准ML是一种函数式语言,变量值的变化是函数式编程中应该避免的。事实上,当我在SML中谈论“变量”时,我的意思是无法更改的值声明。我建议你多考虑一下你的问题,也许你可以把问题分成子问题。祝你好运。