deimos-lang/sketching/july_2025/trait.dm
2025-08-01 07:47:56 -05:00

41 lines
1.1 KiB
Plaintext

pub trait HasTruth
fn isTruthy() -> Boolean
def fn isFalsy() -> Boolean = !self.truthy
end
pub trait Functor[Self<T>]
fn <U> map(f: fn (t: T) -> U) -> Self<U>
end
pub trait Lift[Self<T>]
static fn lift(t: T) -> Self<T>
end
pub trait Applicative[Self<T>, U, V] : Functor[Self] + Lift[Self] where T is fn (u: U) -> V
fn apply(us: Self<U>) -> Self<V>
end
pub trait Monad[Self<T>] : Functor[Self] + Lift[Self]
fn <U> flatMap(f: fn (t: T) -> Self<U>) -> Self<U>
end
// Traits as higher-kinded types
// - Cannot be used as concrete types, casted, etc.
// - Cannot be constructed/instantiated
// - Imports are different:
// ```
// use std::core::Option
// use std::trait::Monad[Option<*>] // bring in Monad for all Option<*>
// ```
// - Once imported, fns are in scope
// - Can also be looked-up 'dictionary' style:
// ```
// use std::trait::HasTruth[Option<Boolean>]
//
// fn main()
// let maybeTruthy: Option<Boolean> = someOtherApiCall()
// if HasTruth[maybeTruthy].isTruthy() then
// println "It's truthy."
// end
// ```