sbreese
#!/usr/bin/env runhaskell
-- sam breese, λ enthusiast. contact me @
{-# Language ViewPatterns #-} -- sbree.se
data T=V Int|A T T|L T T|P T T|Y deriving
(Show,Read,Eq);m f i(V j)=f i j; m f i(A
x y)=A(m f i x)$m f i y;m f i(L t x)=L(m
f i t)$m f(i+1)x; m f i(P t x)=P(m f i t
)$m f(i+1)x;m _ _ x=x; ifm True x=Just x
; ifm _ _=Nothing;mb f g (g->Just v) y =
Just$f v y;mb f g x (g->Just v)=Just$f x
v;mb _ _ _ _=Nothing;up i=m$ \j k->if k-
j>=0then V$k+i else V k;dn=m$ \i j->if j
<i then V$j-1else V j;su v=m$ \i j->if i
==j then up i 0 v else V j;e1(A(L _ x)y)
=Just$su(dn 0 x)0y;e1(A x y)=mb A e1 x y
;e1(L t x)=mb L e1 t x;e1(P t x)=mb P e1
t x;e1 _=Nothing;n x=case e1 x of{ --sjb
Nothing->x;Just y->n y};teq(fmap n->Just
t)(n->y)=t==y;teq _ _=False; inf c(V i)=
ifm(i<length c)$c!!i;inf c(A x y)=do{P i
o<-n<$>inf c x;u<-inf c y;ifm(teq(Just i
)u)$su y 0o}; inf c(L t x)=ifm(teq(inf c
t)Y)=<<P t<$>inf(up 1 0t:c)x;inf c(P t x
)=ifm(teq(inf c t)Y&&teq(inf(up 1 0t:c)x
)Y)Y;inf c Y=Just Y;main=do {putStr"λ ";
t <- readLn; case inf[] t of {Nothing ->
print "err";Just y->print(n t,y);};main}
hi i'm sam me at sbree.se i enjoy: - free software - functional programming - literature - types - reproducible builds - automation - tabletop games - web development? - math - fediverse - other things potentially i previously worked for https://galois.com but right now i'm taking a little break and trying to do my own thing if you need anything please feel free to contact me via email. i'm always interested in unique opportunities. thanks for reading :)