35구현 문제
중첩된 요청에서 payload 꺼내기
1. 문제와 수정 범위
payloadOrZero가 받는 Packet은 Request 구조체를 담은 Data이거나, 값이 없는
Flush입니다. Data이면 요청의 payload를, Flush이면 8'h00을 반환해야 합니다.
starter는 인자를 보지 않고 항상 8'h00을 반환합니다. 그래서 공개 실행에서는 Data
줄도 a5가 아니라 00으로 출력됩니다.
payloadOrZero의 본문만 수정하세요. 두 타입 선언, 함수 시그니처, mkTop은 그대로
둡니다. 패킷을 비트로 unpack해서 필드를 잘라 내지 말고, 타입의 구조에 패턴을 맞추세요.
2. starter 읽기와 실행 전 예측
Packet을 먼저 읽어 보세요. 선택지가 두 개이고, 값을 담는 쪽은Data뿐입니다.Request를 읽어 보세요.Data에 담긴 구조체에는channel과payload가 있고, 결과에 필요한 필드는 하나입니다.mkTop의 호출 두 개를 읽어 보세요. 하나는payload가8'ha5인tagged Data request를, 다른 하나는tagged Flush를 전달합니다.
실행 전에 두 줄을 예측해 보세요. 시작 코드에서는 두 줄 모두 00이고, 틀린 줄은 Data
쪽입니다. 상수를 반환해도 타입이 맞으므로 컴파일은 성공합니다. 이것은 동작 오류입니다.
3. 최소 수정과 완료 조건
상수 반환을, 선택지마다 분기가 하나씩 있는 case ... matches로 바꾸세요. Data 분기는
바깥에서 안쪽으로 만듭니다. tag를 먼저 맞추고, 그 안의 구조체를 맞춘 뒤, 마지막에
필요한 필드에만 이름을 붙입니다. 결과에 쓰지 않는 필드는 구조체 패턴에서 생략할 수
있습니다.
수정한 뒤 실행에서 Data 줄은 a5, Flush 줄은 00이어야 합니다. payload를 묶은
변수가 Data 분기 안에서만 존재하는 이유도 설명해 보세요. 다른 분기에는 필드를 꺼낼
요청이 없습니다.
- 모든
Data패킷은 자기payload를 반환합니다.payload가 0이거나channel이 달라도 마찬가지입니다. - 모든
Flush패킷은8'h00을 반환합니다. tagged union과 그 안의 구조체 모두에 패턴 매칭을 씁니다.- 화면의
8'ha5를 상수로 반환하면 다른payload에서 실패합니다.
4. 단계형 힌트
힌트 1: 타입 구조대로 패턴 세우기
패턴은 데이터와 같은 구조로 중첩됩니다. 바깥 패턴이 활성 tag를 검사하고, 안쪽 구조체 패턴이 담긴 값의 필드 하나를 변수에 묶습니다.
힌트 2: Data 분기 시작하기
첫 분기는 Data tag로 시작하고, 그 뒤에 Request 구조체 패턴을 둡니다. 구조체 전체를
변수 하나로 받지 마세요.
힌트 3: 반환할 필드만 묶기
구조체 패턴 안에서 결과에 필요한 필드에만 패턴 변수를 붙이세요. Flush 분기에는 묶을
값이 없습니다.
5. 추가 실험
payload 대신 2비트 channel을 결과 폭으로 확장해 반환한다고 가정해 보세요. 패턴에서
그대로 남는 부분과 위치가 바뀌는 변수를 종이에 적어 보세요.