대신 GHC의 -fdefer-type-errors
옵션을 사용하여 (ab?)를 기반으로 다른 아이디어를 얻었습니다. 이는 hint
과 같은 전체 하스켈 인터프리터를 포함하는 것보다 저렴할 수 있습니다. 그 출력은 약간 혼란 스럽지만 컴파일 중에 경고가 출력되기 때문에 GHC -w
옵션을 사용하여 일반적으로 의 경고를 끄려면 파일과 ghc
명령 모두를 지울 수 있습니다. 선.
여기에 하나의 모듈에서이를 보여주기위한 모든 내용이 포함되어 있지만이 테스트의 옵션은 관련 테스트 모듈에서만 올바르게 설정되어야한다고 가정합니다.
이 방법은 잘못된 유형의 오류를 표시 할 정도로 문제의 가치를 충분히 평가할 수 있는지에 따라 달라지며 일부 유스 케이스에서는 까다로울 수 있습니다.
{-# OPTIONS_GHC -fdefer-type-errors #-}
{-# LANGUAGE TypeOperators, GADTs, DataKinds #-}
{-# LANGUAGE StandaloneDeriving #-}
import GHC.TypeLits
import Control.Exception
import Data.Typeable
data Vector n t where
EmptyVec :: Vector 0 t
ConsVec :: t -> Vector n t -> Vector (n+1) t
-- Add a Show instance so we can evaluate a Vector deeply to catch any
-- embedded deferred type errors.
deriving instance Show t => Show (Vector n t)
illegalVec = ConsVec 'c' (ConsVec "b" EmptyVec)
test = do
t <- try . evaluate $ length (show illegalVec)
case t of
Right _ -> error "Showing illegalVec gave no error"
Left e -> putStrLn $ "\nOk: Showing illegalVec returned error:\n"
++ show (e :: ErrorCall)
-- ErrorCall is the exception type returned by the error function and seems
-- also to be used by deferred type errors.
아마도 '메타 테스트'를 원할 것입니다. 코드를 컴파일하려고하는 작은 스크립트를 작성하고 컴파일러가 코드 0으로 종료하지 않도록하십시오. – Kris
여기에 일종의 종속 유형을 구현하려고합니다. ... 여기에 어떤 언어 확장 기능을 사용 하시겠습니까? 첫 번째 파트가 전혀 작동하지 않게하려면. – Carsten
@ CarstenKönig :'TypeOperators','GADTs','DataKinds' 및'GHC.TypeLits'의 가져 오기. –