나는 Haskell의 다항식에 대해 다항식 r과 그것에 대한 Ring 인스턴스를 가지고있다. (class Ring r where plus :: r -> r -> r ; times :: r -> r -> r ; negative :: r -> r ; zero :: r ; one :: r
- Num의 단순화 된 버전입니다.) 정의하고 싶지 않은 데이터 타입을 정의하기
gauss = x^2 + 1
또는
eisenstein = x^2 + x + 1
로 다항식 등을 정의 할 수 있습니다 다음에서 작동합니다. 그것이 문제입니다. 실제 데이터 유형이 아니기 때문에 따옴표로 썼습니다. 정의 방법을 알 수 없습니다.
내가 먼저 data Quotient p = Quot p p
그런 짓을하려하고, 예를 들어 우리는 이미 아주 나쁜이지만이 one
및 zero
를 정의도 불가능 물론 plus (Quot a i) (Quot b i') | i == i' = Quot (plus a b) i
있을 것입니다. 그래서 data Quotient p = Quot p (Maybe p)
으로 바꿨는데 제 생각에는 작동중인 구현을 사용하고 있다고 생각합니다. 그러나 plus
이 작동하는지 (적어도 하나의 Just
이 필요하고 두 개가 같아야합니다) 확실히 알 수는 없습니다.
안전하지 않은 함수를 사용하는 것은 안전합니까? iskell에서 이것을 프로그래밍하는 방법이 있습니까? 나는 꽤 난처한 처지이다. 감사!
당신이 정말로 원하는 것은 [의존형] (http://en.wikipedia.org/wiki/Dependent_type) (하스켈에는 존재하지 않음)입니다; 이것은 데이터 타입이 값에 의해 매개 변수 화되는'data Quotient (p :: *) (q :: Polynomial r) = Quot p'와 같은 것을 말할 수있게합니다. 이 경우 에뮬레이션 할 수있는 방법이 있지만 확실하지 않습니다. –
Numeric Prelude (http://hackage.haskell.org/package/numeric-prelude-0.2)를 보셨습니까? 그들은 이런 종류의 문제를 해결하기 위해 많은 노력을 기울였습니다. –
@Antal, 각 다항식에 newtype을 사용하면 'Quotient'가 작동한다고 생각합니다. 그래도 고통스러워. –