edit: som nadviazala s viac konkrétnu otázku. Ďakujeme, že ste answerers tu, a ja si myslím, ale otázka sa lepšie vysvetliť zmätky, zoznámil som tu.
TL;DR som snažia získať dôkazy o obmedzení do výrazov, pri používaní pridávať nové aplikácie s existenciálne obmedzenia na konštruktérov. (to je vážne sústo,, prepáč!)
Som destilovanej problém sa dole na nasledujúce. Som jednoduchý GADT, ktorý predstavuje bodov názvom X
a funkcie aplikácie s názvom F
. Body X
sú fixovaný, aby sa Objects
.
data GADT ix a where
X :: Object ix a => a -> GADT ix a
F :: (a -> b) -> GADT ix a -> GADT ix b
Constrained
týka kontajnerov, ktorých objekty sú obmedzené tým, že niečo a Object
je to niečo. (edit: môj skutočný problém zahŕňa Category
a Cartesian
žiaci z obmedzená-kategórie)
-- | 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)
Ja by som chcel napísať výraz:
-- error: Could not deduce: Object ix Int arising from a use of ‘X’
ex0 :: GADT ix String
ex0 = F show (X (3 :: Int))
A zatiaľ čo zrejmé, riešenie funguje to rýchlo stáva podrobného pri stavbe väčších výrazy:
-- Typechecks, but eventually verbose
ex1 :: Object ix Int => GADT ix String
ex1 = F show (X (3 :: Int))
Myslím, že správne riešenie by malo vyzerať približne takto:
-- 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))
Ale stále nemôžem dostať, že dôkaz Object ix Int
.
Som si istý, že je to jednoduchšie, ako si myslím. Snažil som sa pridať obmedzenia na Object
obmedzenia rodiny v GADT
trieda stupňa. Snažil som sa ponúka obmedzenia vo výraze podpis. Snažil som sa QuantifiedConstraints
aj napriek tomu , že nie som si istý, že som plne pochopiť ju ešte. Prosím, pomôžte mi múdry ty!
Runnable:
{-# 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
, že by zaviesť tony dopredu kotla doska (nový predohra), aj keď, asi eliminovať budúce štandardný. WrtInferrenceChain
Som snaží mapa je na môj problém, ale možno, ale pomáha lepšie vysvetliť? Ďakujem btw!