News for hackers. Stuff that matters.
Re:A simple ray tracer in Lean 4 by tomhoule on Monday February 01, 2021 @08:57AM (#25988700)
I am really enjoying lean 3 as a theorem prover; lean 4 as a programming language is a really intriguing/enticing prospect. The "functional but in place" paradigm is something quite new, as far as I can tell. For reference, see the "Counting Immutable Beans" paper[1] by the designers of the language, that details how the runtime makes use of reference counts to do destructive updates in pure code whenever possible.

[1]: https://arxiv.org/pdf/1908.05647.pdf

Re:A simple ray tracer in Lean 4 by creata on Monday February 01, 2021 @10:57AM (#25989729)
Lean has an array type, which the docs say is implemented much like a C++ vector or Rust Vec. But data types in functional programming languages all expose an immutable interface, so what happens when someone changes the list in two different ways? Is a new copy of the array made, is some variant of a persistent array used, or does the program just fail to compile?

https://leanprover.github.io/lean4/doc/array.html

Re:A simple ray tracer in Lean 4 by derkha on Monday February 01, 2021 @12:36PM (#25990916)
Lean 4 developer here. If the array is shared, we make a full copy. It's the same semantics as in Swift.
Re:A simple ray tracer in Lean 4 by creata on Monday February 01, 2021 @02:35PM (#25992652)
Thanks. I assumed that option would be a major footgun (since accidental copies can be very expensive) but if it works for Swift, it can't be that bad.
Re:A simple ray tracer in Lean 4 by ivanbakel on Monday February 01, 2021 @09:18AM (#25988876)
A similar-but-different approach exists in (largely Dutch) research around uniqueness typing, which uses static analysis guarantees to allow for destructive updates wherever the compiler can prove something is uniquely referenced. To my knowledge, efforts have been made to integrate that approach into GHC.
Re:A simple ray tracer in Lean 4 by orbifold on Monday February 01, 2021 @09:42AM (#25989068)
I think the novel thing is that this is doing it dynamically, which bypasses the static analysis and makes it applicable to situations where static analysis wouldn't be useful.
Re:A simple ray tracer in Lean 4 by kmill on Monday February 01, 2021 @03:29PM (#25993422)
As I understand it, it does some static analysis still. The big idea with the Perseus algorithm, I think, is that instead of lending a reference at a function call, it is given. This leads to numerous optimizations where memory can statically be reused. They still do dynamic checks that an object has only one reference, too, when it's not statically known.
Re:A simple ray tracer in Lean 4 by creata on Monday February 01, 2021 @11:32AM (#25990143)
Are you referring to Linear Haskell[0] or some other effort? Linear Haskell can definitely express destructive updates, but IIRC it needs unsightly stuff like constructors which take continuations and method signatures along the lines of

    length : Array a -o (Array a, Unrestricted Int)
which have to thread the unique value through them, since there's no notion of borrowing.

[0]: https://gitlab.haskell.org/ghc/ghc/-/wikis/linear-types

Re:A simple ray tracer in Lean 4 by ivanbakel on Monday February 01, 2021 @04:02PM (#25993901)
I'm talking about uniqueness typing. It's similar to linear types, but not the same. If you search the term, you can find a few research papers from Dutch universities, particularly around Clean, a programming languages which uses uniqueness typing instead of monads for IO.
Re:A simple ray tracer in Lean 4 by creata on Monday February 01, 2021 @11:52PM (#25997551)
Thanks. I'm aware of that, but I can't find any such efforts for Haskell in particular.
Re:A simple ray tracer in Lean 4 by xiphias2 on Monday February 01, 2021 @10:51AM (#25989673)
Why is linear typing not implemented though? Can the theorem prover prove for some function that reference counting doesn't have to be used?
Re:A simple ray tracer in Lean 4 by tomhoule on Monday February 01, 2021 @10:57AM (#25989728)
I can't claim to know the details, but my understanding is that the interaction of linear typing with dependent types is an open research problem (see the quantitative type theory papers, for example). It's also a burden on the user rather than the runtime, so it's a tradeoff.
Re:A simple ray tracer in Lean 4 by xiphias2 on Monday February 01, 2021 @11:06AM (#25989846)
Is it still a big burden if the theorem prover can automate checking that a function can be evaluated without ref counting / garbage collector? I understand that it's a very hard problem though.
Re:A simple ray tracer in Lean 4 by haskellandchill on Monday February 01, 2021 @12:19PM (#25990680)
I'm trying to understand why dependent types can't represent linearity since you can model Nat at type level in dependent types. Dependent types can do capability modeling at the type level and linearity (or affinity) seems like a capability. From this thread (https://www.reddit.com/r/haskell/comments/20k4ei/do_dependen...) it seems like it can be done. I'm looking for something more formal to explain the orthogonality (or simulatability) of linear types inside a dependent type system.
Re:A simple ray tracer in Lean 4 by chriswarbo on Monday February 01, 2021 @01:14PM (#25991461)
From my understanding, dependent types can model linearity, but you'd need to use that model type system rather than the 'native' type system (similar to how, for example, Bash can model OOP (e.g. using a mixture of naming conventions, associative arrays, eval, etc.), but isn't natively OOP). If we go down that route, we're essentially building our own programming language, which is inherently incompatible with the dependently-typed language we've used to create it (in particular: functions in the underlying language cannot be used in our linear-types language, since they have no linearity constraints).

A common example is a file handle: I can prove that the 'close' function will produce a closed handle, e.g.

    close : Handle Open -> Handle Closed
I can prove that those handles point to the same file:

    close : (f: Filename) -> Handle f Open -> Handle f Closed
I can prove arbitrary relationships between the input values and the output value. Yet nothing I do restrict the structure of a term, like how many times a variable is used, to prevent e.g.

    foo h = snd (close h, readLine h)
For that sort of control, we need to build the ability to track things into the term language itself; either by adding linear types (or equivalent) to the language, or building a new incompatible language on top (as I mentioned above).
Re:A simple ray tracer in Lean 4 by haskellandchill on Monday February 01, 2021 @02:02PM (#25992167)
Cool. Actually I should know more about this since I took a lecture series with Krishnaswami on this topic. He combines the two type systems in a way that makes sense and can produce a programming language.

But yes, for the linearity control you'd need to model variables within the type system and indirect to a function handling h's resource relationship instead of using it directly.

Formally I would like to compare linear types and dependent types and their ability to encode or not each other. I don't know what the tools for that are.