whole-program inference
whole-program inference whole-program inference whole-program inference
This commit is contained in:
40
README.org
40
README.org
@@ -60,7 +60,8 @@ Available debug flags include:
|
||||
|
||||
** TODO rlp to core desugaring :feature:
|
||||
|
||||
** TODO [#A] HM memoisation prevents shadowing :bug:
|
||||
** DONE [#A] HM memoisation prevents shadowing :bug:
|
||||
CLOSED: [2024-04-04 Thu 12:29]
|
||||
Example:
|
||||
#+begin_src haskell
|
||||
-- >>> runHM' $ infer1 [rlpExpr|let f = \x -> x in f (let f = 2 in f)|]
|
||||
@@ -71,6 +72,29 @@ Example:
|
||||
-- let f = \x -> x in f (let f = 2 in f) :: Int
|
||||
#+end_src
|
||||
For the time being, I just disabled the memoisation. This is very, very bad.
|
||||
*** Closing Remarks
|
||||
Fixed by entirely rewriting the type inference algorithm :P. Memoisation is
|
||||
no longer required; the bottom-up inference a la Algorithm M was previously
|
||||
hacked together using a comonadic extend with a catamorphism, which, for each
|
||||
node, would fold the entire subtree and memoise the result, which would then
|
||||
be retrieved when parent nodes attempted to infer children nodes. This sucks!
|
||||
It's not "bottom-up" at all! I replaced it with a gorgeous hand-rolled
|
||||
recursion scheme which truly works from the bottom upwards. A bonus
|
||||
specialisation is that it annotates each node with the result of a
|
||||
catamorphism from that node downwards via the cofree comonad.
|
||||
#+begin_src haskell
|
||||
dendroscribe :: (Functor f, Base t ~ f, Recursive t)
|
||||
=> (f (Cofree f a) -> a) -> t -> Cofree f a
|
||||
dendroscribe c (project -> f) = c f' :< f'
|
||||
where f' = dendroscribe c <$> f
|
||||
|
||||
dendroscribeM :: (Traversable f, Monad m, Base t ~ f, Recursive t)
|
||||
=> (f (Cofree f a) -> m a) -> t -> m (Cofree f a)
|
||||
dendroscribeM c (project -> f) = do
|
||||
as <- dendroscribeM c `traverse` f
|
||||
a <- c as
|
||||
pure (a :< as)
|
||||
#+end_src
|
||||
|
||||
** DONE README.md -> README.org :docs:
|
||||
CLOSED: [2024-03-28 Thu 10:44]
|
||||
@@ -81,9 +105,13 @@ For the time being, I just disabled the memoisation. This is very, very bad.
|
||||
CLOSED: [2024-03-28 Thu 11:55]
|
||||
|
||||
** DONE whole-program inference (wrap top-level in a ~letrec~) :feature:
|
||||
CLOSED: [2024-03-28 Thu 11:33]
|
||||
CLOSED: [2024-04-04 Thu 12:42]
|
||||
shadowing issue sucks. i'm going to have to rewrite the whole type inference
|
||||
system later. and i never learn, so i'm gonna use a chronomorphism :3.
|
||||
*** Closing Remarks
|
||||
I don't know how a fucking chronomorphism works. None of the experts can
|
||||
think of a single example of how to use it. The rewrite uses a bottom-up
|
||||
recursion scheme I've dubbed ~dendroscribe~.
|
||||
|
||||
** TODO user-supplied annotation support in Rlp/HindleyMilner.hs :feature:
|
||||
|
||||
@@ -110,9 +138,15 @@ For the time being, I just disabled the memoisation. This is very, very bad.
|
||||
#+end_src
|
||||
4. hit "type-check"
|
||||
|
||||
** TODO in Rlp/HindleyMilner.hs, fix ~listenFreshTvNames~ :housekeeping:
|
||||
** DONE in Rlp/HindleyMilner.hs, fix ~listenFreshTvNames~ :housekeeping:
|
||||
CLOSED: [2024-04-04 Thu 13:17]
|
||||
it /does/ work in its current state, however it captures an unreasonably
|
||||
excessive amount of names, even for a heuristic.
|
||||
*** Closing Remarks
|
||||
Fixed with the proper Algorithm M rewrite. The original purpose of
|
||||
~listenFreshTvNames~ (tracking monomorphic type variables) has been solved
|
||||
much more cleanly via the (non-monadic!) ~monomorphise~ function paired with
|
||||
the new ~ImplicitInstance~ constraint.
|
||||
|
||||
** TODO up-to-date examples [0/2] :docs:
|
||||
- [ ] quicksort (core and rlp)
|
||||
|
||||
Reference in New Issue
Block a user