edit: jsem navázala s více konkrétní otázku. Děkuji answerers tady, a myslím, že navazující otázka se lépe vysvětluje některé nejasnosti jsem zde představil.
TL;DR jsem se snaží dostat dokladů o omezení do výrazů, při použití GADTs s existenciální omezení na konstruktérů. (to je vážně sousto, omlouvám se!)
Vytáhnul jsem problém až do následující. Mám jednoduchý GADT, které představuje body, tzv. X
a funkce aplikací tzv. F
. Body X
jsou omezena tak, aby byla Objects
.
data GADT ix a where
X :: Object ix a => a -> GADT ix a
F :: (a -> b) -> GADT ix a -> GADT ix b
Constrained
odkazuje na nádoby, jejichž objekty jsou omezeny něco a Object
je to něco. (edit: můj problém spočívá Category
a Cartesian
třídy z omezených-kategorie)
-- | 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)
Chtěl bych napsat vyjádření:
-- error: Could not deduce: Object ix Int arising from a use of ‘X’
ex0 :: GADT ix String
ex0 = F show (X (3 :: Int))
A zatímco jasné řešení funguje, to se rychle stává verbose při budování větších výrazy:
-- Typechecks, but eventually verbose
ex1 :: Object ix Int => GADT ix String
ex1 = F show (X (3 :: Int))
Myslím, že správné řešení by měl vypadat nějak 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 já stále nemůže dostat, že důkaz Object ix Int
.
Jsem si jistý, že je to jednodušší, než jsem myslel. Snažil jsem se přidávat omezení na Object
omezení rodiny v GADT
instanci třídy. Snažil jsem se nabízet omezení ve výrazu podpis. Snažil jsem se QuantifiedConstraints
, i když, nejsem si jistý, že jsem plně pochopit. Prosím, pomozte mi, moudří!
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
to by představit spoustu vpředu kotle plate (nový předehra), i když, pravděpodobně eliminovat budoucí smlouva. WrtInferrenceChain
,, Snažím se o mapu na můj problém, ale možná v návaznosti pomáhá vysvětlit lépe? Děkuji btw!