추상 위키백과/업데이트/2022-01-13
◀ | 추상 위키백과 업데이트 | ▶ |
새해 복 많이 받으시고 2022년 첫 뉴스레터에 오신 것을 환영합니다!
위키함수에 대한 작업을 시작할 때 작업을 11개의 함수 단계로 나누었습니다. 그리스 알파벳의 처음 11개 글자의 이름을 따서 명명했습니다(최근에 악명 높은 명명 체계). 우리는 현재 제네릭 유형과 함수를 허용하여 위키함수의 함수 모델을 완전히 다시 수행하는 것을 목표로 에타(η) 단계를 작업 중입니다.
팀 내 논의에 따라 현재 단계의 완료 기준을 구체화하여 보다 가시적으로 만들고 있습니다. 단계를 완료했음을 표시하는 방법에 대한 원래 아이디어는 다음과 같은 함수 호출을 위해 매우 심층적인 정적 유효성 검사를 많이 수행하는 것이었습니다:
- (1)
if(head([true]), false, true)
유효성을 검사하지만
- (2)
if(head(["text"]), false, true)
은 안됩니다. 설명하자면 if
함수는 첫 번째 인수로 Boolean
이 필요하지만 head
는 현재 head(List) → Object
로 정의되어 있습니다. 따라서 정적 분석에서 if
는 Boolean
이 필요하지만 Object
를 얻습니다. 그러나 이것이 괜찮다고 한다면 (1)과 (2) 모두에 대한 정적 분석은 통과할 것이고 (2)는 통과해서는 안 됩니다.
반면에 정적 분석뿐만 아니라 코드를 실행할 때 발생하는 동적 분석도 있습니다. 그 중 (1)은 false
을 전달하고 반환해야 하는 반면, (2)는 평가 중에 유형 오류를 발생시켜야 합니다("if
는 첫 번째 인수에서 Boolean
을 예상하지만 String
을 얻었습니다"와 같은 것).
지금은 심층 정적 분석의 범위를 해제하기로 결정했습니다. 이것은 아마도 Wikifunctions.org를 시작한 후에 나중에 추가할 수 있는 것입니다. 보시다시피 사용자는 어떤 식으로든 오류 메시지를 받게 됩니다. 정확히 언제 오류가 발생했는지에 대한 질문일 뿐입니다. 또한 이러한 주제 또는 유사한 주제에 대한 작업에 관심이 있는 경우 연락하십시오. 우리는 항상 자원 봉사자 및 기타 외부 파트너의 작업을 기꺼이 통합합니다.
이 정적 분석 대신 단계가 완료되는 방법의 예로서 다음 기능에 초점을 맞추기로 결정했습니다.
curry
를 위키에서 컴포지션으로 구현할 수 있지만 엄격한 정적 분석이 필요하지 않음- 위키에서 다음 세 가지 '사용자 정의' 유형 생성 가능:
positive integer
,sign
그리고integer
- 위키에서 작성을 통해 일반 감싸기(래퍼) 유형을 만들 수 있음
- 재설계된 기능 편집기 제공(다음 단계로 푸시될 수 있음)
이러한 각 기능에 대해 자세히 알아보겠습니다.
커링
이것이 작동하려면 사용자가 함수를 인수로 사용할 수 있어야 하고 해당 함수를 curry
구현의 함수 호출에 사용할 수 있어야 합니다. 커리는 무엇인가요? 커리는 함수 f와 다른 객체 x를 취하여 객체에 대해 함수를 실행하는 컴퓨터 과학의 표준 함수입니다. 표준 형식은 함수 f에 두 개의 인수가 있으며 첫 번째 인수는 x 유형이고 '출력'은 두 번째 인수가 값 x로 미리 설정된 함수 f에 대한 호출입니다. 예: 다른 문자열에 문자열을 추가하는 함수가 주어지면, curry(append, "s")
를 호출하여 "끝에 s를 추가"
하는 새 함수를 만들 수 있습니다. 우리는 그러한 함수를 정의하고 호출하는 것을 가능하게 만들고 싶습니다.
사용자 정의 유형
양의 정수
다음 사항이 가능해야 합니다:
String
유형의 단일 키value
를 사용하여 새 유형Positive Integer
를 만듭니다.Positive Integer
를 검증하는 함수 생성value
에 숫자(0-9)가 아닌 문자가 포함된 경우 유효성 검사기는 숫자가 아닌 문자로 사용자 생성 오류를 발생시킵니다.value
에 선행 0이 포함되어 있고 단일 0이 아닌 경우 유효성 검사기는 사용자 생성 오류를 발생시킵니다.value
가 빈 문자열이면 유효성 검사기가 사용자 생성 오류를 발생시킵니다.
- 유효성 검사기를
Positive Integer
유형에 연결합니다. - 다음 8개 함수를 만듭니다:
Is zero: Positive Integer → Boolean
(인수가 0이면True
를 반환하고 그렇지 않으면False
를 반환)Successor: Positive Integer → Positive Integer
(1만큼 증가된 인수를 반환)- 자바스크립트로 구현 제공 (
BigInt
) 및 파이썬 (bignum
)
- 자바스크립트로 구현 제공 (
Predecessor: Positive Integer → Positive Integer
(1만큼 감소된 인수를 반환하고 인수가 0인 경우 오류를 발생)- 자바스크립트로 구현 제공 (
BigInt
) 및 파이썬 (bignum
)
- 자바스크립트로 구현 제공 (
Positive Integer: String → Positive Integer
(생성자)Positive Integer as String: Positive Integer → String
(소멸자)Equal Positive Integer: Positive Integer, Positive Integer → Boolean
(두 숫자의 값이 같은지 여부)Greater Than: Positive Integer, Positive Integer → Boolean
(첫 번째 숫자가 두 번째 숫자보다 큰지 여부)Lesser Than: Positive Integer, Positive Integer → Boolean
(두 번째 숫자가 첫 번째 숫자보다 큰지 여부)
부호
수학 용어 "부호"와 관련하여 다음과 같은 일이 가능합니다:
Sign
유형의 단일 키identity
를 사용하여 새 유형Sign
생성Sign
유형의 가능한 세 가지 값을 생성, 즉positive
,negative
및neutral
Sign
유효성을 검사하는 함수 생성- 값이 예상되는 세 값 중 하나가 아니면 오류 발생
- 유효성 검사기를
Sign
유형에 연결 - 다음 함수를 생성:
Equal sign: Sign, Sign → Boolean
(두 인수의 값이 같으면 True 반환)
정수
다음과 같은 일이 가능:
Positive Integer
유형의absolute value
및Sign
유형의sign
라는 두 개의 키가 있는Integer
유형을 새로 생성Integer
유효성을 검사하는 함수 생성- 두 키가 모두 검증되었는지 확인
sign
가neutral
이고absolute value
가zero
가 아니거나 "그 반대의 경우"인 경우 오류를 발생
Integer
유형으로 유효성 검사기를 연결- 다음 6가지 함수 생성:
Integer: Positive Integer, Sign → Integer
(생성자)Absolute value: Integer → Positive Integer
(소멸자)Sign: Integer → Sign
(소멸자)Equal Integer: Integer, Integer → Boolean
(두 숫자의 값이 같은지 여부)Greater Than: Integer, Integer → Boolean
(첫 번째 숫자가 두 번째 숫자보다 큰지 여부)Lesser Than: Integer, Integer → Boolean
(두 번째 숫자가 첫 번째 숫자보다 큰지 여부)
제네릭 래퍼
제네릭 래퍼는 형식을 취하고 해당 형식의 값을 가진 단일 키가 있는 새로 생성된 형식을 반환하는 함수입니다. 래퍼는 예를 들어 실수로 무언가를 숫자처럼 보이는 숫자로 취급하지 않도록 하는 데 유용할 수 있습니다. 다소 단순한 제네릭 유형이기 때문에 테스트 케이스로도 유용합니다.
- 제네릭 유형을 생성하는 함수 생성, 즉
Wrap Type: Type → Type
- 제네릭 생성자 함수 생성, 즉
Wrap: Type T → Function
시그니처의 함수를 반환하는 함수T → Wrap Type(T)
- 제네릭 소멸자 함수 생성, 즉
Unwrap: Type T → Function
시그니처의 함수를 반환하는 함수Wrap Type(T) → T
Wrap Type(Boolean)
유형의 리터럴을 위키 상의 객체로 저장Wrap Type(T)
과 함께 작동하는 함수를 생성하는 제네릭 함수를 작성, 즉Wrapped Equality: Type T → λ: Wrap(T), Wrap(T) → Boolean
- 이 모든 기능은 사용자 공간에서 완전히 작성될 수 있어야 합니다.
Unwrap(Boolean)(Wrap(Boolean)(True))
와 같은 것을 호출하여 테스트하고True
를 다시 얻기
다음은 어디로?
이 단계에서 수행해야 할 작업이 아직 많이 있지만 대부분의 작업이 거의 완료되었습니다. 이 단계가 완료되면 여러분이 플레이할 수 있도록 베타 클러스터를 준비하는 데 집중할 것입니다.
새해 복 많이 받으세요!