In Idris/Haskell, one can prove properties of data by annotating the types and using GADT constructors, such as with Vect, however, this requires hardcoding the property into the type (e.g. a Vect has to be a separate type from a List). Is it possible to have types with an open set of properties (such as list carrying both a length and running average), for example by overloading constructors or using something in the vein of Effect?
Open Type Level Proofs in Haskell/Idris
716 Views Asked by David Harrison At
1
There are 1 best solutions below
Related Questions in HASKELL
- Cabal sandbox is using a global dependency. Could not resolve
- Haskell lens: let binding of Traversal'
- How can I parse fixed-length, non-delimited integers with attoparsec?
- Pipeline-like operation using TChan
- compile-time vs. run-time cost of Hamlet templates
- Date-time package in haskell - error in the current one, can't find an analog
- How does one debug infinite recursion in Haskell?
- Force GHC using local files
- List with random numbers in Haskell
- Changes in other elements based on listbox selections in threepenny-gui
- Multithreading and gtk2hs
- Operator section for applicative with <$> and <*>
- Unable to create a custom header to use it in "withManager"
- How do I reuse an intermediate value in chain of Haskell Either binds?
- Haskell, Tree problems
Related Questions in PROOF
- Proving a recursive algorithm
- Agda: Simulate Coq's rewrite tactic
- Handling let in hypothesis
- unique minimum spanning tree sufficient and necessary conditions
- All pairs out of four
- Hamming distance of two integers mysql
- Dafny - Substring implementation
- How would you write ∀ y ∈ R+, ∃ z ∈ R, e^z = y in pseudocode?
- batch processing proof of the number of jobs' relationship with service time and waiting time
- Prove So (0 < m) -> (n ** m = S n)
- Proving lemma in Isabelle
- How to show that something increases relational expressive power?
- Open Type Level Proofs in Haskell/Idris
- How to prove that Greedy approaches will not work
- How to prove that "Total" is not recursive (decidable)
Related Questions in CATEGORY-THEORY
- The fixed point functors of Free and Cofree
- Does a natural monoidal structure on copoints of a Functor induce a Comonad?
- Sum of indexed functors
- Are type-level functors just functors in the 2-category of Hask?
- Defining Categories and Category Laws in Haskell
- Is there a term for a monad that is also a comonad?
- Open Type Level Proofs in Haskell/Idris
- Initial algebra for rose trees
- Real-world applications of zygohistomorphic prepromorphisms
- Equivalence relations are to Groups, as partial order relations are to...?
- What type corresponds to a xor b in type theory?
- If Either can be either Left or Right but not both, then why does it correspond to OR instead of XOR in Curry-Howard correspondence?
- Is an identity functor in Category of sets a function application?
- Matrix as Applicative functor, which is not Monad
- List based on right Kan extension
Related Questions in CORRECTNESS
- Bellman-Ford algorithm proof of correctness
- Open Type Level Proofs in Haskell/Idris
- How to justify the correctness and runtime of an algorithm
- How does algorithm for Longest increasing subsequence [O(nlogn)] work?
- Controlling database record correctness
- why performance is zero for the following logic?
- Simple assert for ordered non re-entrant calling?
- Verifying program correctness using phantom types in Haskell
- Write a wrapper object in Javascript
- How important is it really to check every array index in PHP?
- Correctness of Inorder traversal using stacks
- Guaranteed way to correctly get the contents of www.bing.com/
- How do I use System.Net.ConnectStream?
- How much work in the Dispose method?
- Formal proof for a factorial number system algorithm
Related Questions in IDRIS
- Primitive operations in proofs
- Idris - Vector Queues and Rewrite Rules
- Replace subexpression in equality proof in Idris
- Automatic detection of domain for dependent type function in Idris
- Example of a `Type 1` that is neither `Type` nor an inhabitant of `Type`
- Prove So (0 < m) -> (n ** m = S n)
- Is there a nice way to use `->` directly as a function in Idris?
- Surprising failure of unification in Idris
- Generating run time proofs with type predicates in Idris
- Open Type Level Proofs in Haskell/Idris
- Implementing Total Parsers in Idris Based on a Paper on Agda
- Idris: Force vector sums to be equal
- Understanding performance characteristics of Wadler's Prettier Printer
- Evaluation of effectual functions giving unexpected results
- LTE for Integers (ZZ)
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
I believe that McBride has answered that question (for Type Theory) in his ornament paper (pdf). The concept you are looking for is the one of an algebraic ornament (emphasis mine):
Now, let's write some code. I've put the whole thing in a gist because I'm going to interleave comments in here. Also, I'm using Agda but it should be easy to tranlate to Idris.
We start by defining what it means to be an algebra delivering
Bs acting on a list ofAs. We need a base case (a value of typeB) as well as way to combine the head of the list with the induction hypothesis.Given this definition, we can define a type of lists of
As indexed byBs whose value is precisely the result of the computation corresponding to a givenListAlg A B. In thenilcase, the result is the base case provided to us by the algebra (proj₁ alg) whilst in theconscase, we simply combine the induction hypothesis with the new head using the second projection:Ok, let's import some libraries and see a couple of examples now:
The algebra computing the length of a list is given by
0as the base case andconst sucas the way to combine anAand the length of the tail to build the length of the current list. Hence:If the elements are natural numbers then they can be summed. The algebra corresponding to that has
0as the base case and_+_as the way to combine anℕtogether with the sum of the elements contained in the tail. Hence:Crazy thought: If we have two algebras working on the same elements, we can combine them! This way we'll track 2 invariants rather than one!
An now the examples:
If we are tracking the length, then we can define Vectors:
And have, e.g., this vector of length 4:
If we are tracking the sum of the elements, then we can define a notion of distribution: a statistical distribution is a list of probabilities whose sum is 100:
And we can define a uniform one for instance:
Finally, by combining the length and sum algebras, we can implement the notion of sized distribution.
And give this nice uniform distribution for a 4 elements set: