NLinker

SK combinators in Rust

Sep 21st, 2020
741
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // by Hirrolot
  2.  
  3. use std::marker::PhantomData;
  4.  
  5. struct S<X, Y>(PhantomData<X>, PhantomData<Y>);
  6. struct K<X>(PhantomData<X>);
  7. struct Var<X>(PhantomData<X>);
  8.  
  9. struct Appl<M, N>(PhantomData<M>, PhantomData<N>);
  10.  
  11. trait Reduce {
  12.     type Result;
  13. }
  14.  
  15. impl<X, Y, Z> Reduce for Appl<S<X, Y>, Z> where {
  16.     type Result = Appl<Appl<X, Y>, Appl<Z, Y>>;
  17. }
  18.  
  19. impl<X, Y> Reduce for Appl<K<X>, Y> {
  20.     type Result = X;
  21. }
  22.  
  23. impl<N, X> Reduce for Appl<Var<X>, N> {
  24.     type Result = Self;
  25. }
  26.  
  27. struct MyVar0;
  28. struct MyVar1;
  29. struct MyVar2;
  30.  
  31. fn main() {
  32.     let _0: <Appl<Var<MyVar0>, Appl<K<MyVar1>, MyVar2>> as Reduce>::Result = todo!();
  33.   //  let () = _0;
  34. }
  35.  
RAW Paste Data