Skip to content

Instantly share code, notes, and snippets.

@ClarkeRemy
ClarkeRemy / dict.sml
Last active September 20, 2024 04:46
Dictionary Passing style
structure Plus = struct
datatype 'a t = T of 'a -> 'a -> 'a
end
structure Mul = struct
datatype 'a t = T of 'a -> 'a -> 'a
end
structure FromInt = struct
@ClarkeRemy
ClarkeRemy / subtratorial.sml
Last active September 13, 2024 12:04
Defunctionalization Subtractorial
(* direct style *)
fun substractorial n =
if n < 0
then 0
else n - substractorial (n-1)
(* Continuation passing style *)
(* In a functional language, when every branch is a "tail call", it optimizes to a jumps *)
(* this could already be turned into a loop pretty easily,
@ClarkeRemy
ClarkeRemy / oop.js
Created September 4, 2024 07:37
Object oriented code JS manual
const interface_method = (object, _interface)=>(method) => (
object._interface[_interface].hasOwnProperty(method)
&& (typeof object._interface[_interface][method]) == "function"
)
const implInterface = (_interface, invariant, object, impl) => {
if (!object.hasOwnProperty("_interface")) {
object._interface = {};
}
object._interface[_interface] = impl
if (!invariant(object)) {throw `FAILED TO IMPLEMENT \`${_interface}\``}
@ClarkeRemy
ClarkeRemy / recursion_schemes.rs
Last active August 30, 2024 20:52
Rust Recursion schemes
#![allow(unused)]
use std::{borrow::Borrow, convert::Infallible};
trait Functor {
type F<T>;
fn fmap<A, B>(f: impl Fn(A) -> B, x: Self::F<A>) -> Self::F<B>;
}
trait Rec: Sized {
type Fix;
@ClarkeRemy
ClarkeRemy / recursion_schemes.sml
Last active August 16, 2024 12:58
Recursion Schemes SML extended
signature FUNCTOR = sig
type 'a F
val fmap : ('a -> 'b) -> 'a F -> 'b F (* F is a category theory functor *)
end
signature FUNCTOR_FIX = sig
include FUNCTOR
type fix (* The Fixpoint type *)
val prj : fix -> fix F (* Recursive *)
@ClarkeRemy
ClarkeRemy / main.rs
Created August 8, 2024 17:56
Recursion Schemes in Rust (naive)
trait Rec : Sized{
type F<T>;
fn fmap<A,B>(f : impl Fn(A)->B, x : Self::F<A>) -> Self::F<B>;
fn prj(t : Self)->Self::F<Self>;
fn inj(t : Self::F<Self>)->Self;
}
fn fold<R : Rec, A>(step : &impl Fn(R::F<A>)->A, x : R )->A {
@ClarkeRemy
ClarkeRemy / main.rs
Last active August 17, 2024 12:28
Flatten State Machine
fn flatten1(t: BinaryTree) -> Vec<i32> {
match t {
BinaryTree::Leaf(leaf) => Vec::from([leaf]), /* ret */
BinaryTree::Branch((l, r)) => {
let mut left /* ret */ = flatten1(*l); //<- rec remember!(r)
let right/* ret */ = flatten1(*r); //<- rec remember!(left)
left.extend(right);
@ClarkeRemy
ClarkeRemy / holes_1.rs
Created July 27, 2024 10:11
Rust with Holes
use std::marker::PhantomData;
pub fn main() {
let mut s = Splitter::new();
s.list[0] = 1;
s.id = 5;
println!("Splitter {{list : [{},{}], id : {} }}", s.list[0], s.list[1], s.id);
@ClarkeRemy
ClarkeRemy / recursion_schemes.sml
Created July 26, 2024 14:42
Recursion schemes based on Wang Murphy paper
(* https://www.cs.cmu.edu/~tom7/papers/wang-murphy-recursion.pdf *)
signature TYP = sig
type t
type 'a F
val Fmap : ('a -> 'b) -> 'a F -> 'b F
val inj : t F -> t
val prj : t -> t F
end
@ClarkeRemy
ClarkeRemy / sml_style.rs
Created July 23, 2024 03:40
based on Okazaki's book
#![no_implicit_prelude]
#![allow(redundant_semicolons)]
extern crate core;
extern crate alloc;
use
{ core::
{ option::Option::{*, self}
, result::Result::{*, self}