λ x를 증명. Ω ≠ Ω in은 Abramsky가 게으른 람다 미적분학 이론 ( Uday Reddy가 이미 인용 한 논문의 2 페이지)에 대해 설정 한 목표 중 하나입니다 . 정의 2.7에서, 그는 에타 감소 λ x를 명시 적으로 논의한다. M x → M은 일반적으로 유효하지 않지만 모든 환경에서 M이 종료되면 가능합니다. 그렇다고해서 M이 전체 함수 여야한다는 의미는 아닙니다. M을 평가하는 것만 종료해야합니다 (예 : 람다로 축소).
귀하의 질문은 실제적인 관심사 (성능)에 의해 동기 부여 된 것으로 보입니다. 그러나 Haskell Report가 완전히 명확하지는 않지만 λ x와 같다는 의심이 듭니다. with 을 사용하면 Haskell을 유용하게 구현할 수 있습니다. Haskell '98을 구현했는지 여부는 논란의 여지가 있지만, 언급이 주어지면 저자가 그 사건을 의도 한 것은 분명합니다.
마지막으로 seq는 임의의 입력 유형에 대한 요소를 생성하는 방법은 무엇입니까? (QuickCheck가 임의 유형 클래스를 정의한다는 것을 알고 있지만 여기에 이러한 제약 조건을 추가 할 수는 없습니다). 이는 파라 메트릭을 위반합니다.
업데이트 : Haskel에 유창하지 않기 때문에이 권리를 코딩하지 못했습니다.이를 수정하면 중첩 된 runST
영역 이 필요한 것 같습니다 . ST 참조에서 단일 참조 셀을 사용하여 이러한 임의의 요소를 저장하고 나중에 읽고 보편적으로 사용할 수 있도록했습니다. 매개 변수는 break_parametricity
아래를 정의 할 수 없다는 것을 증명하지만 (예 : 오류를 반환하는 경우 제외) 제안 된 시퀀스가 생성하는 요소를 복구 할 수 있습니다.
import Control.Monad.ST
import Data.STRef
import Data.Maybe
produce_maybe_a :: Maybe a
produce_maybe_a = runST $ do { cell <- newSTRef Nothing; (\x -> writeSTRef cell (Just x) >> return x) `seq` (readSTRef cell) }
break_parametricity :: a
break_parametricity = fromJust produce_maybe_a
필자는 여기에 필요한 파라 메트릭 증거를 공식화하는 데 약간의 애매함을 인정해야하지만, 비공식적 인 파라 메트릭 사용은 Haskell에서 표준입니다. 하지만 데릭 드레 이어의 저술에서 필요한 이론이 지난 몇 년 동안 빠르게 해결되고 있다는 것을 알게되었습니다.
수정 :
- ML과 같은 명령형 및 유형이 지정되지 않은 언어로 연구되는 확장 기능이 필요한지 또는 고전적인 파라 메트릭 이론이 하스켈을 포함하는지 여부조차 확실하지 않습니다.
- 또한 나는 데릭 드레 이어 (Dreek Dreyer)에 대해 언급했는데, 나중에 나중에 Uday Reddy의 작품을 만났기 때문에 "Reynolds의 본질"에서만 최근에 알게되었습니다. (나는 지난 달 정도에 파라 메트릭에 관한 문헌을 읽기 시작했습니다.)