2017-03-02 2 views
2

내가 여기제약 조작 패키지

class C1 t 

class C2 t 

참고가 있다고 가정하자 :

C1 :: * -> Constraint 
C2 :: * -> Constraint 

내가 할 수

class (C1 t, C2 t) => C3 t 
instance (C1 t, C2 t) => C3 t 

그래서 우리는

C3 :: * -> Constraint 

C3 tC1 tC2 t 인 경우에만 유효한 경우라고 지적합니다.

또한, 우리는 확장의 무리를 추가하는 경우 :

{-# LANGUAGE TypeFamilies #-} 
{-# LANGUAGE MultiParamTypeClasses #-} 
{-# LANGUAGE ConstraintKinds #-} 
{-# LANGUAGE UndecidableSuperClasses #-} 
{-# LANGUAGE FlexibleInstances #-} 
{-# LANGUAGE FlexibleContexts #-} 
{-# LANGUAGE TypeOperators #-} 

우리는 심지어 같은 좀 더 일반적인 것을 수행 할 수 있습니다

class (c1 a, c2 a) => And c1 c2 a 
instance (c1 a, c2 a) => And c1 c2 a 

type C3 = C1 `And` C2 

을 그리고 예상대로이 작동합니다.

class (c1 a b, c2 a b) => And2 c1 c2 a b 
instance (c1 a b, c2 a b) => And2 c1 c2 a b 

을하거나 추가 :

이 내가 할 수 있기를 원하는 제약의 유일한 조합이 아닌, 예를 들어, 내가 두 변수의 제약을 결합 할 수 있도록하고 싶습니다, And2 말 첫 번째 변수에 대한 추가 제약 조건 :

class (c1 a, c2 a b) => AddFirst c1 c2 a b 
instance (c1 a, c2 a b) => AddFirst c1 c2 a b 

물론 많은 가능성이 있습니다. 새로운 종류의, 제약의 유형으로 유형 클래스를 만들어

ConstraintKinds을 :

지금 내가있는 내가 인용의 constraints 패키지를 찾고 있었어요, 바퀴를 재발견 싶지 않다. ConstraintKinds와

Eq :: * -> Constraint 
Ord :: * -> Constraint 
Monad :: (* -> *) -> Constraint 
우리는 어색한 해결하지 않고 이러한 새로운 유형의 조작 에 대한 코드로 툴을 많이 넣을 수 있습니다.

이것은 법안에 맞는 것 같지만 설명서에 분실되어 있습니다.

constraints 패키지가이 게시물에 나와있는 기능을 수행합니까? 그렇다면 예제를 제공해 줄 수 있습니까? 그렇지 않다면 제약 조건 조작을위한 다른 패키지가 있습니까? 아니면 이것을 라이브러리에 직접 채워야합니까?

답변

2

generics-sop에는 많은 수의 함수가 제약 조건에 대해 매개 변수화되어 있기 때문에 이러한 종류의 제약 조건 조작이 종종 필요합니다.

따라서 라이브러리에는 많은 보조자 클래스가있는 Generics.SOP.Constraint 모듈이 포함되어 있습니다 (특히 And). 그들이 일반적으로 유용하다고 판명되면 원칙적으로 더 많이 추가 될 수 있습니다.

제약 라이브러리는 기본적으로 GHC가 자동으로 증명할 수없는 타입 클래스에 관한 것들을 증명할 수있는 유틸리티를 제공하여 사전과 함축적 표현을 명시 적으로 표현하는 약간 다른 문제에 관심이 있습니다. (&&&)을 통해 제약 조건을이 라이브러리와 결합하는 것이 가능합니다. 다시 말하면 generics-sop은 비슷한 기능을 가지고 있습니다 (기능은 훨씬 적지 만 목적은 적지 만). Generics.SOP.Dict입니다.