(기능적?) 프로그래밍의 맥락에서 "수정"과 "수정"은 무엇을 의미합니까?


81

이 용어는 haskell과 함수형 프로그래밍에 대한 블로그 (특히 sigfpe의 블로그 ) 에서 많이 읽었 지만 그것이 의미하는 바에 대해서는 전혀 모르겠습니다. 나는 대부분의 경우 그것을 모른 채 도망 치지 만, 내가 알았다면 아마도 텍스트를 훨씬 더 잘 이해했을 것입니다. Google은 나를 돕지 않았습니다. 나는 기술적 인 일에 빠져 들었다.

또한 세계의 비 기술적 의미 ( "추상적 구체화")는 코드에서 무언가를 구체화하는 것이 실제로 의미하는 바를 이해하는 데 도움이되지 않습니다.

나는 컴퓨터 과학 개념에 다소 느리기 때문에 코드를 사용한 실용적인 예제가 좋을 것입니다. :피

답변:


41

그래서 저는 이것에 대해 읽어 봤습니다. 그것이 의미하는 바는 꽤 많습니다. 추상적 개념을 취하고 그것을 구체적으로 만듭니다. 또는 추상적 인 개념을 나타내는 프록시가 있습니다. 예를 들어 Lisp에서는 람다를 사용할 때 프로 시저 추상화 및 적용의 개념이 수정됩니다.

수정 자체는 광범위한 개념이며 함수형 프로그래밍 언어에만 적용 할 수 없습니다.

예를 들어 Java에는 런타임에 사용할 수있는 유형이 있습니다. 이들은 수정 가능한 유형입니다. 즉, 런타임 중에 유형의 추상 개념에 대한 구체적인 표현이 있습니다. 대조적으로, 수정 불가능한 유형이 있습니다. 이것은 Java에서 제네릭을 사용하는 동안 특히 분명합니다. Java에서 제네릭은 유형 삭제의 영향을 받으므로 런타임 중에 제네릭 유형 정보를 사용할 수 없습니다 (매개 변수화 된 유형이 제한되지 않은 와일드 카드를 사용하지 않는 한).

또 다른 예는 개념을 모델링하려고 할 때입니다. 예를 들어, Group클래스와 클래스 가 있다고 가정하십시오 User. 이제 둘 사이의 관계를 설명하는 특정 추상 개념이 있습니다. 예를 들어 a User의 구성원이되는 추상적 인 개념은 Group. 이 관계를 구체적으로 만들기 위해 a가의 멤버 isMemberOf인지 여부를 나타내는 메서드를 작성 User합니다 Group. 그래서 여기에서 한 것은 그룹 멤버십 의 추상적 인 개념구체화 (실제 / 명시 적 / 구체화) 한 것 입니다.

또 다른 좋은 예는 객체간에 부모-자식 관계가있는 데이터베이스입니다. 이 관계를 나무 의 추상적 인 개념 으로 설명 할 수 있습니다 . 이제 데이터베이스에서이 데이터를 가져와 실제 Tree 객체를 생성하는 함수 / 메서드가 있다고 가정 합니다. 당신이 지금했던 것은 구체화 에 관계 트리 같은 부모 - 자식의 추상적 인 개념을 실제 Tree 객체입니다.

일반적으로 기능적 언어로 돌아 가면 아마도 수정의 가장 좋은 예는 Lisp 프로그래밍 언어 자체의 생성 일 것입니다. Lisp는 완전히 추상적이고 이론적 인 구조였습니다 (기본적으로 컴퓨터 언어에 대한 수학적 표기법). Lisp의 eval기능이 실제로 IBM 704에서 Steve Russel에 의해 구현 될 때까지 그대로 유지 되었습니다.

Hackers & Painters의 Paul Graham이보고 한 내용에 따르면, p. 185, McCarthy는 다음과 같이 말했습니다. "Steve Russell이 말했습니다.이 평가판을 프로그래밍하는 것이 어떻습니까? 그리고 저는 그에게 말했습니다. 호, 호, 이론과 연습을 혼동하고 있습니다.이 평가는 읽기를위한 것이 아니라 하지만 그는 내 논문의 eval을 IBM 704 기계 코드로 컴파일하고 버그를 수정 한 다음이를 Lisp 인터프리터로 광고했습니다. 본질적으로 오늘날의 형태 ... "

그래서 리스프가 된 구체화 실제 프로그래밍 언어, 추상적 인 개념에서.  


2
상황에 따라 구체화가 연속적으로 존재하는 것 같다. 추상적 인 lisp가 프로그래밍 언어로 구체화되었지만, 프로그래밍 언어 자체는 계산을 전달하는 꽤 추상적 인 개념 형태입니다. 이는 기계 코드로, 마지막으로 1과 0, 그리고 마지막으로 전기 신호로 구체화되어야합니다. 따라서 수정은 추상화의 반대 (이중)입니다.
CMCDragonkai

25

수정

수정은 인스턴스화의 한 형태입니다. 개념을 구체화 할 때 제공 한 사전 정의처럼 추상적 인 것을 취하고 구체적으로 만듭니다.

가능한 유형의 추상 구문 트리에 서식하는 용어로 유형을 수정하도록 선택할 수 있습니다.

일부 언어에 대한 범용 구현을 제시하여 디자인 패턴을 구체화 할 수 있습니다. 예를 들어,

template<typename T> class Singleton {
    public:
        static T& Instance() {
            static T me;
            return me;
        }

    protected:
       virtual ~Singleton() {};
       Singleton() {};
}

싱글 톤 디자인 패턴을 C ++의 템플릿으로 수정합니다.

Hoare의 quicksort 아이디어를 원하는 프로그래밍 언어로 구현할 수 있습니다. 이런 맥락에서 저는 범주 이론의 개념을 하스켈 코드로 구체화하는 데 많은 시간을 할애합니다.

해당 언어에 대한 통역사로 언어를 수정할 수 있습니다. Perl 언어에 대한 Larry Wall의 아이디어는 Perl 인터프리터로 구체화됩니다.

데이터 구체화 하고 진공 패키지가 함께 공유 메모리에 어떻게 구성되어 있는지를 나타내는 그래프 등의 조건을 구체화.

반사

구체화의이면은 구체적인 것을 취하고 일반적으로 세부 사항을 잊어 버림으로써 추상화를 생성하는 반사 입니다. 추상화가 더 간단하거나 어떤 식 으로든 당신이 말하는 내용의 본질을 포착하기 때문에 이것을하고 싶을 것입니다.

Java, C # 등의 유형 시스템 리플렉션은 프로그래밍 언어의 구체적인 클래스를 가져 와서 클래스가 제공하는 멤버 목록에 대한 액세스를 제공하는 클래스의 추상 구조를 제공합니다. 여기서 우리는 유형의 구체적인 개념을 취하고 그 구조를 설명하는 추상적 인 용어를 생성하고 특정 값을 버립니다.

프로그래밍 언어를 구현으로 구체화하는 방법과 마찬가지로 때때로 반대 방향으로 갈 수 있습니다. 이것은 일반적으로 나쁜 생각으로 간주되지만 구현을 취하고 원하는 동작 속성에서 언어 사양을 반영하려고 할 수 있습니다. TeX는 Knuth, sans 사양에 의해 처음 구현 되었습니다. TeX의 모든 사양은 Knuth의 구현에서 반영되었습니다.

(좀 더 공식적으로 당신이 반사를 구체적인 영역에서 추상적 인 영역으로 데려가는 건망증의 펑터로 본다면, 이상적으로는 구체화는 반사에 인접 해있는 것이다.)

내가 유지 하는 리플렉션 패키지는 용어를 사용하여이를 나타내는 유형을 생성하는 reify 메서드를 제공 한 다음 새 용어를 생성 할 수있는 reflect 메서드를 제공합니다. 여기서 '콘크리트'도메인은 유형 시스템이고 추상 도메인은 용어입니다.


21

로부터 하스켈 위키 :

무언가를 "수정"한다는 것은 추상적 인 것을 취하고 그것을 물질로 간주하는 것입니다. 고전적인 예는 고대인들이 추상적 인 개념 (예 : "승리")을 취하여이를 신 (예 : 그리스의 승리의 여신 Nike)으로 바꾸는 방식입니다.

수정 된 유형은 유형을 나타내는 값입니다. 실제 유형 대신 수정 된 유형을 사용하면 값으로 수행 할 수있는 모든 조작을 수행 할 수 있습니다.


15

제가 생각할 수있는 한 가지 용도는 수업을 사전으로 바꾸는 것입니다. Eq수업을 들어 보겠습니다 ( /=연산자는 잠시 잊으세요).

class Eq a where
    (==) :: a -> a -> Bool

이 클래스를 수정하면 다음과 같이됩니다.

data EqDict a = EqDict (a -> a -> Bool)

구성, 검사 등이 가능합니다. 또한 주목할만한 점은 Eq유형 당 하나의 인스턴스 만 가질 수 있지만 여러 EqDict값을 가질 수 있다는 것 입니다. 그러나 인스턴스의 자동 생성 (예 : 요소에 대해 목록이있을 때 목록이 같음)은 작동하지 않습니다. EqDict [a]가치를 직접 구성해야 합니다.

수정 프로세스는 다음과 같이 간단합니다 (이 경우).

reify :: Eq a => EqDict a
reify = EqDict (==)

Eq클래스를 사용하는 함수는 다음과 같이 변환 할 수 있습니다.

-- silly example, doesn't really do anything
findMatches :: Eq a => a -> [a] -> [a]
findMatches x ys = [ y | y <- ys, x == y ]

-- version using EqDict
findMatchesDict :: EqDict a -> a -> [a] -> [a]
findMatchesDict (EqDict f) x ys = [ y | y <- ys, f x y ]

EqDict를 풀고를 전달하면 like 및 friends 와 같은 함수를 a -> a -> Bool얻을 수 있습니다. 리드에 대한 유사한 트릭입니다 ...ByData.List.nubByOrdData.List.sortBy


9

Haskell의 맥락 에서조차이 용어는 매우 광범위하게 사용됩니다. Andy Gill의 reify 패키지를 사용하면 재귀 구조를 사용하여 명시 적 그래프로 변환 할 수 있습니다. 연속에 대한 Sigpfe의 게시물은 "나머지 계산"개념을 전달할 수있는 값으로 구체화하는 방법을 설명합니다. 템플릿 Haskell에는 하스켈 값의 이름이 주어 졌을 때 사용 가능한 정보 (선언 된 위치, 유형 등)를 반환하는 reify 함수 (일반적으로 TH 코드와 함께 컴파일 타임에 실행 됨)가 있습니다.

이 모든 경우의 공통점은 무엇입니까? 그들은 우리가 추론 할 수 있고 알 수는 있지만 프로그래밍 방식으로 직접 조작 할 수없는 것을 취하고 다른 것과 마찬가지로 이름을 지정하고 전달할 수있는 실제 1 급 값으로 바꾸는 것에 대해 이야기하고 있습니다. 그리고 그것은 일반적으로 사람들이 단어를 사용할 때 전달하고자하는 의도입니다.


2

RDF에 수정의 개념이 있다는 것을 알고 있습니다. Tim Bernes-Lee는 다음 같이 말했습니다 .

이 맥락에서 재화는 언어를 사용하여 언어로 무언가를 표현하여 언어로 처리 할 수있는 것을 의미합니다.

나는 그것이 일종의 성찰이나 성찰과 같다고 생각합니다. 여기에서 좋은 답변을 얻으시기 바랍니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.