2014-12-05 30 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 

O为需要计算平均分数,并返回谁收到高于平均得分学生写尽可能多的功能。 例如

-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"}]; 

您可能还需要保持你的变量,类型名称一致。我认为约定是为类型名称和骆驼案例(如camelCase)使用蛇形案例(如snake_case)作为变量和函数名称。

这里有一些实际的错误:

为了您student变量,你给的类型info list,这并不在你的程序中存在。我假设你的student_information变量曾被命名为info,所以你应该改变其中的一个。您的变量名称为3studentsResult。变量不能以数字开头,他们必须以字母开头。您必须重命名该变量,如threeStudentsResult

在您的3studentsResult变量中,您正在使用稍后定义的average函数。这在Standard ML中不起作用。你应该在使用它之前定义一个函数。 (除非需要相互递归,否则可以使用and关键字,但与您的问题无关。)因此,在3studentsResult之前定义average,并在average之前定义student_score

即使修复这些后,您的student_score功能也不正确。我认为sum=sum+10意味着您正在尝试更改sum的值,就像您在命令式编程语言中所做的那样。但是,标准ML是一种功能性语言,变量的变化值是您在函数式编程中应该避免的。事实上,当我谈论SML中的“变量”时,我的意思是不能改变的价值声明。我建议你多思考一下你的问题,也许你可以将你的问题分解为子问题。祝你好运。