할 수 있는 방법을 파생 typeclass 인스턴스에서는 제 가족 범위에 있는?

0

질문

편집: 에 따라 더 구체적인 질문. 감사 answerers 여기에,그리고 나는 생각한 후속 질문가 더 나은 작업의 일부를 설명하는 혼란을 나는 여기에 소개한다.


TL;박사 나를 증거의 제약 조건으로 표현을 사용하는 동안,GADTs 와 존재 제약 조건에서 생성자입니다. (는 심각한 입,죄송합니다!)


나는 증류 문제로 다음과 같습니다. 저는 간단하 GADT 을 나타내는 포인트라고 X 와 기능이라는 응용 프로그램 F. 포인트 X 로 제한됩 Objects.

data GADT ix a where
  X :: Object ix a => a -> GADT ix a
  F :: (a -> b) -> GADT ix a -> GADT ix b

Constrained 말 컨테이너의 개체는 제한에 의해 무언가가Object뭔가. (편집: 나의 진짜 문제가 포함 CategoryCartesian 클래스에서 제한된 범주)

-- | I can constrain the values within containers of kind `* -> *`
class Constrained (ix :: * -> *) where
  type Object ix a :: Constraint

-- | Here's a trivial constraint. A more interesting one might include `Typeable a`, for ex
instance Constrained (GADT ix) where
  type Object (GADT ix) a = (Constrained ix, Object ix a)

나는 다음과 같이 쓰는 표현:

-- error: Could not deduce: Object ix Int arising from a use of ‘X’
ex0 :: GADT ix String
ex0 = F show (X (3 :: Int))

과는 뻔한 솔루션을 작동,빠르게 자세한 정보를 건축할 때 더 큰 표정:

-- Typechecks, but eventually verbose
ex1 :: Object ix Int => GADT ix String
ex1 = F show (X (3 :: Int))

내가 생각하는 올바른 솔루션은 다음과 같이 보일 것입니다:

-- error: Could not deduce: Object ix Int arising from a use of ‘X’
ex2 :: Constrained ix => GADT ix String
ex2 = F show (X (3 :: Int))

하지만 나는 아직도 얻을 수 없다는 증거의 Object ix Int.

나는 그것의 더 간단하다고 생각하죠. 가 추가하는 조건 Object 제약 조건에서 가족 GADT 클래스의 인스턴스입니다. 가 제공하는 제약 조건에서 표현의 서명이 있습니다. 가 QuantifiedConstraints지만,나는 확실하지 않다 나는 완전히 파악됩니다. 저를 도와주세요 현명한 그들!


실행 가능:

{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeFamilyDependencies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE InstanceSigs #-}

module Test where

import Data.Kind
import Data.Functor.Identity
import Data.Functor.Const

-- | I can constrain the values within containers of kind `* -> *`
class Constrained (ix :: * -> *) where
  type Object ix a :: Constraint

-- | Here's a trivial constraint. A more interesting one might include `Typeable a`, for instance
instance Constrained (GADT ix) where
  type Object (GADT ix) a = (Constrained ix, Object ix a)

-- | A demo GADT that has function application ('F'), and points ('X'). The
-- points are constrained.
data GADT ix a where
  X :: Object ix a => a -> GADT ix a
  F :: (a -> b) -> GADT ix a -> GADT ix b

-- -- Broken
-- -- error: Could not deduce: Object ix Int arising from a use of ‘X’
-- ex0 :: GADT ix String
-- ex0 = F show (X (3 :: Int))

-- Typechecks
-- but for larger programs becomes verbose, requiring many explicit constraints
ex1 :: Object ix Int => GADT ix String
ex1 = F show (X (3 :: Int))

-- -- What I want, but, it's broken
-- ex2 :: Constrained ix => GADT ix String
-- ex2 = F show (X (3 :: Int))
2

최고의 응답

1

더없이 컨텍스트의 말을 열심히 최고의 솔루션,하지만 여기에 몇 가능성:

피 제한 모두에

그대로,당신의 GADT 것으로 보이지 않는 많은 이유를 제한하는 X 하기 Object. 어쩌면 이것은 그냥하지 않 필요합니까?

data GADT ix a where
  X :: a -> GADT ix a
  F :: (a -> b) -> GADT ix a -> GADT ix b

대신에,제약 조건에서 올 수 있었는 외부의 경우 자유롭게 연출할 수 있습니다.

쌩의 제약 조건을 나열하지만,그들에게는 더 좋

는 경우에 당신은 많은 다른 종류에서는 식 모든 필요를 충족 같은 제약 조건을 사용할 수 있습니다 같은 도우미 All

ex2' :: All (Object ix) '[Int] => GADT ix String
ex2' = F show (X (3 :: Int))

수있는 더 많은 종류의 목록에 추가 Int;그리고/또는 당신할 수 있습을 동의어 제약 조건 등

type StdObjs ix = (Object ix Int, Object x Bool, ...)

ex2'' :: StdObjs ix => GADT ix String
ex2'' = F show (X (3 :: Int))

전파한 제약 조건 뒤에을 통해 데이터 자체 구조

해야 하는 경우에 대한 제약조건 X 값을 수있다,그럼에도 불구하고 있을 가능한 이것을 표현하는 또 다른 방법에 GADT. 예를 들어,만약 이 기능이 는 일반적인 기능을 하지만 무언가를 이미 제약이만 허용 Objects 이 있을 수 있습는 이를 다음과 같이 설명합니다:

data YourFunc ix a b where
  YourFunc :: Object ix a => (a->b) -> YourFunc ix a b

show' :: Object ix Int => YourFunc ix Int String
show' = YourFunc show

이 직접 하지 않는 도움말 문제가 당신에 대해 묻는다,그러나 어쩌면 이 기능이 공유하거나 무언가이다. 수도 같은 뭔가

class Object ix a => InferrenceChain ix a where
  type PreElem ix a :: Type
  propInferrence :: (InferrenceChain ix (PreElem a) => r) -> r

다음

data YourFunc ix a b where
  YourFunc :: InferrenceChain ix a
                 => (PreElem a -> a) -> YourFunc (PreElem a) a

그 결국 당신은 수 있는 증거 X 제약 조건에서 그냥 퍼팅 Object ix String 외부에 recursing 상 propInferrence. 하지만 이것은 아마 매우 훌륭.

2021-11-23 18:30:17

나는 물 후속 질문이. Wrt eliding 제약 조건을 따를 보여줍니다 왜 그들이 필요합니다. Wrt 제약 조건 목록에,내가 아직도 생각성이 될 것이 신혼여행으로 멕시코 크다. Wrt YourFunc는 것을 소개 톤의 앞을 보일러 플레이트(새로운 전주)하지만,아마도 제거하는 미래를 보일러. Wrt InferrenceChain에,나는 고지도에 나의 문제이지만,아마 후속 설명하는 데 도움이 좋을까? 감사 btw!
Josh.F

와우,누가 당신의 저자는 라이브러리 나는 장난으로, constrained-categories에 대한 감사 라이브러리,그것은 놀랍습니다!
Josh.F

만,나는 기쁘를 듣고 당신이 그것을 찾을 유용합니다!
leftaroundabout
1

내가 생각하는 올바른 솔루션은 다음과 같이 보일 것입니다:

-- error: Could not deduce: Object ix Int >arising from a use of ‘X’
ex2 :: Constrained ix => GADT ix String
ex2 = F show (X 3)

불행하게도,이 솔루션은 없습니다. 컴파일러는 정당 지지 않는다는 것을 알 Object ix Int 을 만족하는 이 시점에서,때문에 모든 그것이 알고 있는 Constrained ix 을 부과할 수 있 는 일부 제약 조건을 통해 Object ix Int.

는 솔루션을 통해 정량화

그래서 아마도 당신이 원하는 것은 제약 조건을 말한다:"이 시점에서,모든 Object ix a 제약용에 만족하는"우리가하기 위해 노력할 수 있습을 통해 어떻게 정량:

{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ConstraintKinds #-}

type Satisfied ix = forall a. Object ix a

ex2 :: Satisfied ix => GADT ix String
ex2 = F show (X 3)

불행하게도,그것은 우리에게 들어 오류가:

• Quantified predicate must have a class or type variable head:
        forall a. Object ix a
• In the quantified constraint ‘forall a. Object ix a’
  In the type synonym declaration for ‘Satisfied’

Object 유 가족과하지 않는 클래스 또는 유형 변수입니다.

다시 건축

왜 하지만... Object 형 가족이 있는가? 사실,왜 Constrained 에 존재로 모든 불법적인 클래스와는 방법이 없습니다? 우리가 원하는 경우 발휘에 대한 제약 조합 컨테이너의 종류,Haskell 이미 우리에게 의미지-사용 인스턴스의 제약!

{-# LANGUAGE MultiParamTypeClasses #-}

class Object ix a

type Constrained ix = forall a. Object ix a

기 때문에 우리가있는 경우

instance (...<some stuff>...) => Constrained Foo where
  type Object ix a = (...<some def>...)

우리 번역할 수 있는

instance (...<some stuff>..., ...<some def>...) 
  => Object ix a

이 예제를 컴파일.

ex2 :: Constrained ix => GADT ix String
ex2 :: F show (X 3)
2021-11-23 10:52:50

이 의미가 있습니다. 불행하게도,내가 무엇을 한 단순화 Constrained에서,진짜 문제는 실제로 CategoryCartesiancartesian-categories는 법적으로 방법입니다. 내가 알지 못하는 방법으로,다른 것보다 TypeFamilies(즉,제약 가족,여기에서)표현하는 아이디어의 클래스의 객체가 임의로 제한된 하위 Hask,그래서 저는 생각하지 않 rearchitecture 작동이 특정 문제입니다.
Josh.F

categories 라이브러리? 나는 당신이 필요하다고 생각 정보를 제공하는 동기를 부여하는 예로를 치료하는 이유 Object 클래스로 작동하지 않는 방법으로,때문에 명확하지 않을 나에게 보고에서 해당 클래스.
Isaac van Bakel

촬영,그래서 죄,이것이 하나입니다! hackage.haskell.org/package/constrained-categories-0.4.1.0
Josh.F

실제로,여기에서 직접 링크를 클래스: hackage.haskell.org/package/constrained-categories-0.4.1.0/docs/...
Josh.F

귀하의 사례는 매우 많은 가 아래와 같은 경로를 걸어. Wrt 당신의 아이디어를 rearchitecture 그것을 요구했던 후속 질문에 보여줍니다 왜 나는 할 수 없습니다,즉, Object 은 typefamily 제 co/도메인이 필요조건에서 다른 있습니다.
Josh.F

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................