문제

나는 이전의 LISP/체계 경험이 있었지만 Haskell Newbie입니다. 지금은 SICP의 예를보고 Haskell에서 더 많은 실무 경험을 얻으려고 노력하고 있습니다. 강의에서 3B 저자는 파생 상품을 상징적으로 계산하는 기능을 제시합니다. 그것은 무엇보다도 다음 줄을 포함합니다.

(define (deriv exp var)
    (cond ((constant? exp var) 0)
          ((same-var? exp var) 1)
; ...

강의에서 더 많은 기능이 정의됩니다.

(define (constant? exp var)
    (and (atom? exp)
         (not (eq? exp var))))

Haskell에서 같은 일을 할 수있는 방법이 있습니까? 즉, 다른 기능과 원자력과 상징적 동등성을 확인하십시오. 또는 더 일반적으로 Haskell에서 "분해"기능의 수단은 무엇입니까?

도움이 되었습니까?

해결책

체계 예제는 실제로 체계 기능을 조사하지 않습니다. 나는 최근에 Haskell에서 다음 유형의 값에 대해 상징적 차별화를했습니다.

data Exp a = Lit a
           | Exp a :*: Exp a
           | Exp a :+: Exp a
           | Var String
  deriving Eq

사용을 차별하는 대신 atom? 또는 eq? 너는 사용한다 case (또는 기타 패턴 일치) 및 ==.

다른 팁

첫째, SICP는 훌륭하지만 Haskell 학습을 위해서는 권장합니다. (#)이 질문의 어려움 중 일부는 이것에서 비롯됩니다.

LISP/체계에서 a '기능' 코드 한 장을 생각하고 기능을 검사한다는 것은 단순히 코드를 검사하는 것을 의미합니다. Haskell에서 a '기능' 세트 A에서 세트 B로의 맵으로 수학적 정의에 더 가까운 것을 의미합니다. 예를 들어 LISP 컨텍스트에서 두 가지 함수를 비교하는 것이 합리적입니다. 코드를 비교합니다. (하지만 그렇습니다 (x+y)^2 그리고 x^2+2*x*y+y^2 다른 기능?) Haskell에서, 그것은 당신이 고려중인 함수의 클래스에 대한 평등을 결정하기위한 건설적인 절차가 있는지 여부에 따라 다릅니다.

마찬가지로, 귀하의 질문과 마찬가지로, LISP/체계에서, 당신은 표현식이 제공 될 때 올바르게 구별되는 "파생"기능을 작성하고, 임의의 입력에 대한 오류를 오류 또는 반환합니다. Haskell의 유형 시스템 하에서, 이것은 (Afaik) 할 수 없습니다. 왜냐하면, 당신이 생각한다면, 임의의 입력을 구별하는 것과 같은 것은 없기 때문입니다. 표현식 만 구별 할 수 있지만 여전히 더 일반적인 클래스는 아닙니다. 모든 것). Norman Ramsey의 답변에서와 같이 먼저 "표현"유형 (또는 유형 클래스)을 정의하고 매우 간단한 다음 기능을 작성합니다.

derive :: Expression -> Expression

분해합니다 Expression 패턴 매칭 구성 (또는 다른 방법에 따라 다른 것 ExpressionS가 구축되었습니다).


(#) : SICP는 완전히 다른 철학을 가지고 있는데, 여기에는 철학이없는 프로그래밍 언어를 사용하고 코드와 데이터의 차이가 부족하지 않기 때문입니다. "Code = Data"인수에 대한 장점이 있지만 (예 : 우리가 사용하는 Von Neumann 아키텍처에서 "모든 것이 0과 1이라는 사실"), 반드시 문제에 대해 추론하거나 모델링하는 좋은 방법은 아닙니다. (Philip Wadler 's를 참조하십시오 계산이 체계보다 나은 이유 자세한 내용은) 현실 세계 하나, 아마도 Simon Thompson의 것입니다 Haskell : 기능 프로그래밍의 기술 또는 Richard Bird 's Haskell을 사용한 기능 프로그래밍 소개 더 나은 선택입니다.

나는 당신이 그렇게 할 수 있다고 생각하지 않습니다. LISP입니다 동종, Haskell은 아닙니다.

그러나 추가 인터넷 검색이 나타났습니다 Liskell, 이것은 (?) 흥미로운 하이브리드입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top