You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

53 lines
945 B
Rust

#[macro_use] extern crate cached;
#[macro_use] extern crate lazy_static;
trait Monad<A> {
fn return_(t: A) -> Self;
//:: A -> Monad<A>
fn bind<MB,B>(m: Self, f: Fn(A) -> MB) -> MB
where MB: Monad<B>;
//:: Monad<A> -> (A -> Monad<B>)) -> Monad<B>
}
fn not_curried(p1: u32, p2: u32) -> u32
{
p1 + p2
}
fn curried(p1: u32) -> Box<Fn(u32) -> u32>
{
Box::new(move |p2: u32| {
p1 + p2
})
}
cached!{
FIB;
fn fib(n: u64) -> u64 = {
if n == 0 || n == 1 { return n }
fib(n-1) + fib(n-2)
}
}
fn main()
{
let fsin = |x: f64| x.sin();
let fabs = |x: f64| x.abs();
let transform = |x: f64| fabs(fsin(x));
not_curried(1, 2);
curried(1)(2);
let immutable_v1 = 1;
//immutable_v1 = 2; //invalid
let mut mutable_v2 = 1;
mutable_v2 = 2;
let x = { println!("side effect"); 1 + 2 };
let y = ||{ println!("side effect"); 1 + 2 };
fib(30);
}