2014-12-05 6 views
1

저는 SML과 같은 연습 문제를 해결하려고합니다.SML의 레코드 및 튜플에 문제가 있습니다

10 개 질문을 포함한 객관식 시험에 사용할 ML 프로그램을 작성하십시오. 프로그램에 다음이 포함되어야합니다.

o 시험의 대답 키 예 :

val key= “adabcbaadb”; 

o 학생의 이름과 답변이 들어있는 레코드 (정보)에 대한 유형 정의. 예 : {name=”Ali”,ans=”abadccdadb”}

o 학생의 이름과 점수가 포함 된 튜플 (결과)에 대한 유형 정의. 예 : ("Ali",60)

o 3 명의 학생 정보가 포함 된 유형 정보 레코드 목록을 작성하고 점수를 계산 한 다음 result 유형의 튜플 목록으로 변환하는 데 필요한만큼의 함수를 작성하십시오. 다른 지원 기능도 작성할 수 있습니다.

예 :

- 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 "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 (snake_case과 같은)를 사용하는 것이라고 생각한다. 당신은 당신의 프로그램에 존재하지 않는 유형 info list을주고,

당신의 student 변수 :

여기에 실제 실수의 일부입니다. student_information 변수의 이름이 info 인 것으로 가정하므로 다른 변수 중 하나를 변경해야합니다.

변수가 3studentsResult입니다. 변수는 숫자로 시작할 수 없으므로 문자로 시작해야합니다. 변수의 이름을 threeStudentsResult과 같은 이름으로 변경해야합니다.

3studentsResult 변수에서 나중에 정의하는 average 함수를 사용하고 있습니다. 표준 ML에서는 작동하지 않습니다. 함수를 사용하기 전에 함수를 정의해야합니다. 상호 재귀가 필요하지 않다면 and 키워드를 사용할 수 있지만 문제는 아닙니다. 따라서 앞에 3studentsResult을 정의하고 앞에 student_score을 정의하십시오.

수정 한 후에도 student_score 기능이 올바르지 않습니다. 나는 sum=sum+10이 당신이 명령형 프로그래밍 언어에서하는 것처럼 sum의 값을 변경하려고한다는 것을 의미한다고 가정합니다. 그러나 표준 ML은 함수형 언어이며 변수의 값을 변경하면 함수형 프로그래밍에서 피해야 할 것이 있습니다. 사실, SML에서 "변수"에 대해 이야기 할 때, 나는 바꿀 수없는 값 선언을 의미합니다. 문제에 대해 좀 더 생각해보고 문제를 하위 문제로 나눌 수 있습니다. 행운을 빕니다.