내가 여기제약 조작 패키지
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 t
이 C1 t
및 C2 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
패키지가이 게시물에 나와있는 기능을 수행합니까? 그렇다면 예제를 제공해 줄 수 있습니까? 그렇지 않다면 제약 조건 조작을위한 다른 패키지가 있습니까? 아니면 이것을 라이브러리에 직접 채워야합니까?