2014-12-05 22 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中的「變量」時,我的意思是不能改變的價值聲明。我建議你多思考一下你的問題,也許你可以將你的問題分解爲子問題。祝你好運。