edit: j'ai suivi avec un plus question spécifique. Merci answerers ici, et je pense que le suivi de la question fait un meilleur travail d'expliquer une certaine confusion, j'ai présenté ici.
TL;DR je suis mal à obtenir des preuves de contraintes dans les expressions, tout en utilisant les GADTs à existentielle contraintes sur les constructeurs. (c'est un grave bouchée, désolé!)
J'ai distillé un problème à la suivante. J'ai une simple GADT qui représente points appelés X
et de la fonction des applications appelées F
. Les points X
sont contraints d'être Objects
.
data GADT ix a where
X :: Object ix a => a -> GADT ix a
F :: (a -> b) -> GADT ix a -> GADT ix b
Constrained
s'agit des conteneurs dont les objets sont limités par quelque chose et Object
c'est que quelque chose. (edit: mon vrai problème consiste à Category
et Cartesian
les classes de contrainte-catégories)
-- | 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)
Je voudrais écrire une expression:
-- error: Could not deduce: Object ix Int arising from a use of ‘X’
ex0 :: GADT ix String
ex0 = F show (X (3 :: Int))
Et alors que la solution la plus évidente œuvres, il devient rapidement détaillé lors de la construction de plus grandes expressions:
-- Typechecks, but eventually verbose
ex1 :: Object ix Int => GADT ix String
ex1 = F show (X (3 :: Int))
Je pense que la bonne solution devrait ressembler à quelque chose comme ceci:
-- 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))
Mais je ne peux toujours pas que la preuve de l' Object ix Int
.
Je suis sûr que c'est plus simple que je pensais. J'ai essayé d'ajouter des contraintes à l' Object
la contrainte de la famille dans le GADT
instance de classe. J'ai essayé offrant des contraintes dans l'expression de sa signature. J'ai essayé QuantifiedConstraints
bien que , je ne suis pas sûr de comprendre parfaitement encore. Merci de m'aider sages!
Exécutable:
{-# 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))
YourFunc
que voudrais vous présenter une tonne de à l'avant de la chaudière de la plaque (un nouveau prélude), bien que, probablement éliminer futur standard. WrtInferrenceChain
, J'ai du mal à la carte sur mon problème, mais peut-être que le suivi permet d'expliquer mieux? Merci btw!