Giter Club home page Giter Club logo

Comments (8)

aaronvargo avatar aaronvargo commented on August 15, 2024 1

You would still need the unsafeCoercing to construct an a :- b from an a => Dict b then.

Here's one way (I think) to do the unsafeCoercing (using the old definition of (:-))

I vote for naming subdict implied:

implied :: forall a b. (a => b) => a :- b

from constraints.

RyanGlScott avatar RyanGlScott commented on August 15, 2024 1

I am also in favor of adding implied.

The change to (:-) proposed in #41 (comment) is interesting, but it would require constraints to cut off support for pre-8.6 versions of GHC. (Unless we were to employ some sort of CPP-based backwards-compatibility hack, which doesn't sound appealing.) Until then, adding implied should be uncontroversial.

from constraints.

Icelandjack avatar Icelandjack commented on August 15, 2024

Wait! Does it require implication constraints

subdict :: forall a b. a `Implies` b => a :- b
subdict = Sub @a @b (Dict @a)

Is it completely equivalent or is one more powerful than the other? I makes sense that entailment is a reified version of implication constraints like these are reified versions of coercion, constraints, equality, ...

Coercion :: Coercible a b => Coercion a b

Dict :: a => Dict a

Refl :: a ~ b => a :~: a

HRefl :: a ~~ b => a :~~: b

If so then there is no way to write subdict until we get implication constraints, feel free to close this.

from constraints.

ekmett avatar ekmett commented on August 15, 2024

There is no way to write this at present.

from constraints.

RyanGlScott avatar RyanGlScott commented on August 15, 2024

This is now possible with the WIP QuantifiedConstraints branch of GHC:

{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
module Foo where

data Dict c where
  Dict :: c => Dict c

newtype a :- b = Sub (a => Dict b)

subdict :: forall a b. (a => b) => a :- b
subdict = Sub (Dict @b)

from constraints.

ekmett avatar ekmett commented on August 15, 2024

This will probably have to wait until 8.6 or so before it can be added directly to the library. It seems like QuantifiedConstraints will miss the 8.4 branch at this point.

from constraints.

Icelandjack avatar Icelandjack commented on August 15, 2024

Can't wait for QC. Going the other way ((a :- b) -> Dict (a => b)) is not possible though

from constraints.

ekmett avatar ekmett commented on August 15, 2024

Building the other direction is a messy exercise in unsafeCoercing enough stuff to produce the right core. It is admissible.

But we could avoid that completely. In the presence of QuantifiedConstraints the encoding I use for (:-) is suboptimal. Switching from the existing Sub Dict encoding to

data a :- b where
   Sub :: (a => b) -> a :- b

or, equivalently,

newtype a :- b = Sub (Dict (a => b))

makes this easy though, giving a good reason to favor such an encoding over the current approach going forward.

from constraints.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.