2011-09-15 2 views
60

난 그냥 몇 가지 하스켈 개발을하고 있었고, 난 GHC의 새 버전에 일부 오래 된 코드를 컴파일 :최신 GHC에서 더 이상 사용되지 않는 DatatypeContexts : 이유가 무엇입니까?

The Glorious Glasgow Haskell Compilation System, version 7.2.1 

을 내가했을 때 나는 다음과 같은 오류 접수 :

Warning: -XDatatypeContexts is deprecated: It was widely considered a misfeature, and has been removed from the Haskell language.

를 나타납니다

data Ord a => MyType a 
    = ConstructorOne a 
    = ConstructorTwo a a 

내 질문은 다음과 같습니다.이 기능은 처음에 왜 사용되지 않았고 내가해야 할 일은 무엇입니까? 동일하거나 유사한 기능을 달성하기위한 nstead?

+11

문맥 만 제거하면 코드는 계속 작동합니다. – augustss

+0

'cabal install '을 시도 할 때 관련 오류가 발생하면'cabal install --ghc-option '-XDataTypeContexts''을 시도하십시오. – ntc2

답변

86

그것은 사용되지 않는 것보세요! 그것이 한 일은 다른 지역에서 추가적인 제약을 강요했습니다. 특히 이러한 유형의 패턴 매칭을 수행 할 때 값을 구성하는 데 사용할 수 있어야한다는 지식에 기반하여 컨텍스트에 대한 액세스 권한을 얻는 대신 (초기에는 희망이있을 수 있음) 제약 조건을 추가해야합니다. 처음에는

실제로 다른 방식으로 작동하고 당신을 위해 알려진 상황을 추적하는 "대체", use GADT-style declarations instead이다 : 일반적으로

data MyType a where 
    ConstructorOne :: Ord a => a -> MyType a 
    ConstructorTwo :: Ord a => a -> a -> MyType a 

GADTs뿐만 아니라 많은 다른 방법으로 더 유연하지만, 이것에 대한 어떤 경우에는 을 생성하는 값은 Ord 제약 조건을 필요로하며,이 제약 조건은 값과 함께 전달되며 생성자의 패턴 일치는이를 다시 꺼냅니다. 따라서 유형을 MyType a으로 예상 할 수 있으므로 Ord a 제약 조건을 갖게되므로 함수를 사용하는 함수에 대한 컨텍스트가 필요하지 않습니다.

+0

마지막 문장은 다소 불투명 한 것처럼 보입니다. GADT 생성자에서 가져온 것은 제약이 아니라 제약 조건을 만족하는 인스턴스입니다. – dfeuer

+0

그러나 너무 많은 생성자가있는 경우에는 각각에 대해 'Ord a'를 반복하기에는 너무 장황하지 않습니까? – fakedrake

+1

@fakedrake 어쨌든 이것이 자주 나오지 않아야한다는 뜻입니다. 당신은 거의 항상 당신의 타입을 제한하고 싶지 않습니다. 'Functor','Foldable','Traversable','Applicative','Monad','Alternative','MonadPlus','Arrow' 등의 타입을 만들 수 없다는 한 가지 예가 있습니다. – semicolon

8

일반적으로 유형을 사용하는 모든 함수에 Ord a 제약 조건을 추가해야하며 이는 유용 할 정도로 유용하지 않습니다. 그것은 가 misfeature, 그리고 유용한 기능이 실제로하지 않았다 때문에이 제거 된 이유에 대한 자세한 내용은 http://hackage.haskell.org/trac/haskell-prime/wiki/NoDatatypeContexts

-1

이 오류가 발생했습니다. 'TypeContext'에 작은 't'가 있어야한다는 것을 제외하고는 ntc2의 제안이 저에게 효과적이었습니다. 즉, cabal install --ghc-option '-XDatatypeContexts' <package>

관련 문제