홈>
목록의 레코드를 업데이트하기 위해 SML 프로그램을 작성하고 있습니다 (예 : person_name 유형이 있습니다.
type person_name = {fname:string, lname:string, mname:string}
그러면 person_name이 포함 된 person_bio가 있습니다.
type person_bio = {age:real, gender:string, name:person_name, status:string}
다음에는 person_bio를 가진 직원이 있습니다.
type employee = {p:person_bio, payrate:real, whours:real} list;
이제 이름을 전달하여 'updateLastName'함수를 정의해야합니다.
현재, 아래 데이터로 하나의 레코드 'e1'을 생성했습니다.
{p={age=40.0,gender="M",name{fname="rob",lname="sen",mname=""},status="M"},
payrate=30.0,whours=10.0}
하지만 목록을 탐색 한 다음 한 필드를 업데이트하는 데 어려움을 겪고 있습니다.
fun updateLastName(x:string,l:employee)=
if (L=[]) then []
else if (x= #fname(#name(#p hd l)) //cheking name of 1st record in list
//not getting how to update,this kind of line did not work
#fname(#name(#p hd l) = "abc"
else updateLastName(x,tl(l)); // hope this is right
제안 해주세요.
- 답변 # 1
- 답변 # 2
상황에 따라 여기에 참조가 적합 할 수 있습니다.
값을 변경해야 할 경우이를 참조로 지정할 수 있습니다.
type person_name = {fname:string, lname:string ref, mname:string} type person_bio = {age:real, gender:string, name:person_name, status:string} fun change_lname(new_lname: string, bio: person_bio) = (#lname (#name bio)) := new_lname val p1 = ... print !(#lname (#name p1)) ==> LastName1 change_lname("LastName2", p1) print !(#lname (#name p1)) ==> LastName2
레코드에서 데이터를 많이 수정하려는 경우, 하나의 값을 변경해야 할 때마다 프로그램이 메모리를 다시 쓰지 않도록 참조하는 것이 좋습니다. 이것을 최적화 할 수 있습니다). 또한 레코드 서명이 변경되면 세터 기능을 다시 작성하지 않아도됩니다. 단점은 참조를 사용하여 프로그램에 복잡성을 도입한다는 것입니다.
예를 들어, 위 코드에서 p1의 성을 수정하지 않고 p1과 사본 (함수로 전달)이 모두 같은 문자열을 가리키고 함수에서 해당 문자열을 수정합니다. 실제로 어느 레코드에서든 데이터를 변경하는 시점은 없으며 레코드가 가리키는 데이터 만 변경합니다. 미묘한 차이이며이 예제에서는 실제로 차이가 없지만 디버그하기 어려운 이상한 버그가 발생할 수 있습니다.
관련 자료
- python - 동일한 값으로 목록의 하위 집합을 업데이트하는 Python 방식
- html - PHP 업데이트 레코드 버튼이 정보를 다른 페이지로 전달하지 않음
- python - Django의 쿼리 셋에있는 모든 개체의 필드 값을 어떻게 업데이트 할 수 있습니까?
- sql - 일부 키의 값으로 직접 pg의 json 배열 데이터를 업데이트하는 방법은 무엇입니까?
- mysql - 새 값이 null이 아닌 경우 행 필드를 업데이트하는 방법
- frontend - 각도에서 데이터베이스의 값을 업데이트하는 방법
- swift - UITextView의 값이 사용자 입력으로 업데이트되지 않습니다
- sql - 업데이트 문에서 열의 최대 값을 업데이트하는 방법
- amazon web services - dynamodb에서 단일 키 값으로 여러 항목을 업데이트하는 방법은 무엇입니까?
- python - Mysql-connector 쿼리가 값을 업데이트하지 않음
- Angular의 변경시 html에서 구독 값을 업데이트하는 방법은 무엇입니까?
- 키 값으로 MySQL JSON 업데이트
- kotlin - jOOQ는 레코드에서 잘못된 열 값을 반환합니다
- MySQL JSON 업데이트 키 값
- reactjs - redux 저장소에서 단일 값 업데이트
- javascript - axios 요청 후 vuejs에서 값 업데이트 지연을 수정하는 방법은 무엇입니까?
- javascript - 목록의 형제를 업데이트하지 않고 매핑 된 목록의 값을 업데이트하려면 어떻게해야합니까?
- TypeScript 3이 포함 된 Nodejs Express API 레코드 업데이트
- javascript - Ajax 호출 후 값을 동기화하여 업데이트하는 방법
- c# - 레코드 유형에 기본값을 추가하는 방법은 무엇입니까? - 에프#
관련 질문
- list : SML의 변수 목록이 제공된 모든 진리 할당 목록을 생성하시겠습니까?
- 빈 튜플 SML
- functional programming - 함수 내에서 변수 업데이트
- sml : 배관을 사용해야 하는지 어떻게 알 수 있습니까?
- SML에서 한 줄씩 파일을 읽는 방법
- smlnj - SML에서 이진 맵 데이터 구조 사용 문제
- recursion - SML에서 int 목록의 모드 찾기 및 라이브러리 함수없이 발생하는 위치 찾기
- smlnj - foldl을 사용하는이 SML 함수를 올바르게 읽는 방법은 무엇입니까?
- functional programming - 목록의 평균을 같은 목록의 모든 요소와 어떻게 비교할 수 있습니까?
- sml - 상태 정보를 저장하지 않고 두 목록의 모든 요소를 비교합니까?
어려운 일이 발생했습니다. 깊이 중첩 된 레코드 업데이트.
레코드에는게터가 있으므로
계속해서#fname (#name (#p employee))
이 성을 업데이트하려는 직원임을 알기 위해 확인중인 필드를 가져옵니다. 그러나 레코드는세터에 해당하는 것을 부여하지 않으므로이를 설정해야합니다. 궁금한 점이 있다면렌즈(Haskell)가이 문제를 해결하는 일반적인 방법이지만 표준 ML에 대한 렌즈 구현은 모르겠습니다.list
를 제거하겠습니다 당신의employee
에 참여 유형;아마employee list
를 원할 것입니다 직원이 여러 사람이라고 말하지 않고 여러 직원을 모델링하려는 경우세터(렌즈를 사용하여 자동으로 파생 할 수있는 것),
예 : 처럼 :
가독성을 높이기 위해 그 줄을 조금씩 나눌 수도 있습니다 :
시도 :