setter처럼 보이는 이름으로 새 객체를 만들면 호출자가 반환값을 버릴 수 있습니다.
state A
검증된 변경
불변 부분 공유
state B
state A 유지
핵심: with·plus 같은 이름과 구조 공유 정책으로 새 값 생성임을 드러냅니다.