Nice programing

최신 GHC에서 더 이상 사용되지 않는 DatatypeContext : 이유는 무엇입니까?

nicepro 2020. 11. 21. 09:15
반응형

최신 GHC에서 더 이상 사용되지 않는 DatatypeContext : 이유는 무엇입니까?


방금 Haskell 개발을하고 있었고 새 버전의 GHC에서 이전 코드를 다시 컴파일했습니다.

The Glorious Glasgow Haskell Compilation System, version 7.2.1

그리고 내가했을 때 다음과 같은 오류가 발생했습니다.

경고 : -XDatatypeContexts는 더 이상 사용되지 않습니다. 널리 잘못된 기능으로 간주되어 Haskell 언어에서 제거되었습니다.

다음 형식의 코드가있을 때 나타납니다.

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

내 질문은 :이 기능이 애초에 사용되지 않는 이유는 무엇이며 동일하거나 유사한 기능을 얻기 위해 대신 무엇을해야합니까?


그것은 때문에 사용되지 않는 것 이었다 misfeature이 실제로하지 않은 유용한 기능을! 그것이 한 일은 다른 위치에 많은 추가 제약을 강제하는 것뿐이었습니다. 특히, 이러한 유형에 대한 패턴 일치를 수행 할 때 값을 구성하는 데 사용할 수 있어야한다는 지식을 바탕으로 컨텍스트에 대한 액세스 권한을 얻지 않고 제약 조건을 추가해야합니다. 처음에.

실제로 다른 방식으로 작동하고 알려진 컨텍스트를 추적하는 "대체"는 대신 GADT 스타일 선언을 사용하는 것입니다 .

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

일반적으로 GADT는 다른 여러 가지 방법에서도 더 유연하지만,이 특정 경우에 발생하는 상황은 생성 하는 Ord 제약이 필요하고 값 과 함께 전달되고 생성자에서 패턴 일치가이를 다시 가져옵니다. 그래서 당신은 그것을 사용하는 함수에 대한 컨텍스트조차 필요하지 않습니다. 왜냐하면 당신은 타입의 무언가를 기대함으로써 그것에 제약을 MyType a받게 될 것임을 알고 있기 때문 Ord a입니다.


일반적으로 유형 Ord a을 사용하는 함수에 제약 조건 을 추가해야 하므로보기 MyType만큼 유용하지 않습니다. 제거 된 이유에 대한 자세한 내용은 http://hackage.haskell.org/trac/haskell-prime/wiki/NoDatatypeContexts를 참조하십시오 .

참고 URL : https://stackoverflow.com/questions/7438600/datatypecontexts-deprecated-in-latest-ghc-why

반응형