Comments (2)
Okay, thanks for your answer.
I assumed that erasures made the data unavailable, now I see that this is not the case and you can use it only in erased positions.
Following your example,
f(x: Bool): Bool
case x
| true => false
| false => true
copy_f : Copy(Bool -> Bool, f)
copy(__ f, equal(__), copy_f)
useCopyf(cpyf: Copy(Bool -> Bool, f)): Pair(Bool -> Bool, Bool -> Bool)
case cpyf
| copy => case cpyf.cpy as ff
| copy => pair(__ cpyf.val , ff.val)
main useCopyf(copy_f)
This type-checked correctly.
from kind.
Two questions:
-
Why exactly erasure prevents something from being copiable?
-
How do you copy something like a
Bool -> Bool
function? As far as I know, we can make a copy for any first-order type like bools, lists, and most common datatypes, but not for functions.
About your questions:
-
Intuitively (as in, I'm not sure) I think any algebraic datatype without functions is copiable. The way we've been thinking in making this part of the language is by automatically deriving a
copy : A -> Pair(A,A)
function for any algebraic datatype (i.e., in the same way we could deriveshow
,read
instances). -
I don't know, that's a great question.
-
It is to prevent affecting the runtime performance by something that should have zero cost, such as imposing type-level restrictions to a type. If you don't plan to run it, you just can use Sigma.
About copy, here is an alternate way to make affine copies:
// Allows copying a value many times in an affine setup
T Copy<T> (x: T)
| copy(
x : T;
val : T,
eql : Equal(T,val,x),
cpy : Copy(T,x)
) : Copy(T,x)
That allows you to copy a copyable value as many times as you want without leaving the affine subset. For example, here is a function that returns an infinite list of copies of a copyable value:
// Copies a value infinitely many times
copies(n: Nat; cpy: Copy(Nat, n)) : List(Sigma(Nat, (x) => x == n))
case cpy
+ equal(Nat; n;) as e0 : Equal(Nat, cpy.x, n)
+ equal(Nat; n;) as e1 : Equal(Nat, cpy.x, n)
| copy =>
let ceql = cpy.eql :: rewrite Equal(Nat, cpy.val, .) with e0
let head = sigma(_ (x) => x == n; cpy.val, ceql)
let tail = main(n; cpy.cpy :: rewrite Copy(Nat, .) with e1)
cons(_ head, tail)
And here is a Copy
instance for true
:
copy_true : Copy(Bool, true)
copy(__ true, equal(__), copy_true)
from kind.
Related Issues (20)
- LLM Support HOT 1
- Bump version to 0.1.2
- Bump cli version to 0.3.8
- Bump cli version to 0.3.9
- "New Type" Optimization
- Improve error messages by removing things like implicit arguments
- Add type checker for erased Pi, App and Lam
- Remove old parser and stuff to use treesitter
- Add new type of error messages used for LLMs.
- error[E0599]: no method named `as_ptr` found for struct `AtomicU64` in the current scope HOT 2
- Add an API for cursor on trees
- Add slash on the end of identifiers as another type of "use"
- Add flag to remove dependency errors
- New panic hook for the language.
- Add flag to show immediate dependencies
- Inconsistency in type check messages
- Update basic function names for Kindex update HOT 1
- Create a project/package manager
- Refactor file loading and name resolution module
- Compiler crashes when using an undeclared alias
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from kind.