2012-10-12 2 views
11

하스켈에서 데이터 유형을 정의 할 때 인스턴스를 자동으로 파생하도록 선택할 수 있지만 자동 파생을 연기 할 수 있습니까? 어쩌면 다른 라이브러리에 넣어도됩니까? 하스켈선언 후 자동 인스턴스 파생

자동 유도하는 실시간 보호기입니다 : 여기

은 예입니다!

module MoneyModule where 

data Money = Money Int 
    deriving Show 

는 지금은 MoneyModule를 사용하고자하지만, 나 또한 Money에 대한 Read 예를 원하는 : 나는 GHC 수 있었다 알고있는

module ExternalModule where 

instance Read Money where 
    read = error "Can't this be done automatically instead?" 

를하지만 자동으로 파생하는 내가 정말 원하는 것 MoneyModule 작성자가 Read 인스턴스를 자동으로 파생시킨 경우에만 수행됩니다.


내가 알고 :

  • 이 누락 된 인스턴스를 패치하여 실제 MoneyModule에서 문제를 해결하는 것이 좋습니다.
  • 고아 인스턴스가있는 것이 좋지 않은 것으로 간주됩니다. 인스턴스 선언 은 유형 클래스 또는 데이터 유형이 정의 된 모듈에 배치하는 것이 바람직합니다.

유형 클래스가 데이터 유형과 관련이 없으므로 제 사례를 따르지 못합니다. 나는 타입 클래스 모듈이나 데이터 타입 모듈 인 이 인스턴스를 보유하기를 원하지 않기 때문에 세 번째 라이브러리를 생성 할 것이므로 응용 프로그램에서 인스턴스 선언이 필요하기 때문입니다.

답변

14

GHC는

{-# LANGUAGE StandaloneDeriving #-} 
import MoneyModule 

deriving instance Read Money 

많은 클래스 인스턴스를 유도 할 수있다, 그와의 StandaloneDeriving 확장자를 갖습니다.

4

독립형 파생 문제를 해결하려면 daniels 솔루션을 참조하십시오. 그러나 귀하의 질문에 언급했듯이, 고아 인스턴스는 모범 사례가 아니며 ghc는 경고를 생성합니다. 고아 고아 경고을 보완하려면 -fno-warn-orphans 플래그를 사용할 수 있습니다. 또한 Cabal 파일에 추가 할 수 있습니다.

... 
library 
    exposed-modules: ... 
    ... 
    ghc-options: -fno-warn-orphans 
... 
관련 문제