[Haskell-cafe] Does the constraints library give (a :- b) -> Dict (a |- b)?

Tom Ellis tom-lists-haskell-cafe-2023 at jaguarpaw.co.uk
Fri Dec 1 16:12:43 UTC 2023


On Fri, Dec 01, 2023 at 03:46:43PM +0000, Tom Ellis wrote:
> On Fri, Dec 01, 2023 at 03:03:17PM +0000, Li-yao Xia wrote:
> > There is an issue with bottoms/nontermination (which I don't see
> > mentioned in those threads).
> 
> Yes, but can we resolve it by simply removing the possibility for
> bottom, e.g. by making Dict unlifted?  The below code seems to be fine
> for example (it prints "fake dictionary"), and that only relies on
> making sure that the Dict# is sufficiently evaluated.

Making Dict# unlifted also seems to resolve the issue.  What do you
think?  Is this sufficient in general to resolve the unsoundness you
spotted?


Tom


type Dict# :: Constraint -> TYPE UnliftedRep
newtype Dict# c = Dict# Any

apDict# :: forall c d. (Dict# c -> Dict# d) -> Dict# (Implies c d)
apDict# = unsafeCoerce id

unImply# :: forall c d. Dict# (Implies c d) -> Dict# c -> Dict# d
unImply# (Dict# f) (Dict# c) = Dict# (unsafeCoerce id f c)

fake# :: () -> Dict# Unsat
fake# () =
  unImply#
    (apDict# (\_ -> error "fake dictionary") :: Dict# (Implies () Unsat))
    (toDict# Dict)

main :: IO ()
main = do
  putStrLn "Hi"
  let !_ = applyDict uncallable (toDict (fake# ()))
  putStrLn "Bye"


More information about the Haskell-Cafe mailing list