Haskell korsanı olarak anlamsız gösterimi tercih ederim. Ne yazık ki bazı insanlar anlamsız gösterimi okumakta zorlanıyorlar ve anlamlı yazarken doğru sayıda parantez almakta zorlanıyorum. Pointfree ile yazılmış kodu anlamlı gösterime dönüştürmeme yardım et!
hakkında
Noktasız gösterimde, bir işlevin çıktısını diğerine beslemek için noktaları (evet, gerçekten) kullanırız. Diyelim ki, succ
bir sayı alan ve ona 1 ekleyen bir işleviniz varsa ve bunu yapmak yerine bir sayıya 3 ekleyen bir işlev yapmak istiyorsanız:
\x -> succ(succ(succ(x)))
bunu yapabilirsin:
succ.succ.succ
Pointfree sadece işlev değildi eğer öyleyse, (zaten bu meydan okumada) ancak tek bir parametresi alması fonksiyonları ile çalışır succ
ziyade add
2 sayı alıp, bunları toplar, hangi sadece bir sol kalmayıncaya kadar o argümanları beslemek gerekir:
pointful: \x -> add 1(add 1(add 1 x))
pointfree: add 1 . add 1 . add 1
Son olarak, işlevler diğer işlevleri bağımsız değişken olarak alabilir:
Pointfree: map (f a . f b) . id
Pointful: \x -> map (\x -> f a (f b x)) (id x)
Javascript equivalent: x => map (x => f(a,f(b,x)), id(x))
Girdi ve beklenen çıktı
f . f . f
\x -> f (f (f x))
f a . f b . f c
\x -> f a (f b (f c x))
f (f a . f b) . f c
\x -> f (\x -> f a (f b x)) (f c x)
a b c . d e . f g h i . j k l . m
\x -> a b c (d e (f g h i (j k l (m x))))
a.b(c.d)e.f g(h)(i j.k).l(m(n.o).p)
\x->a(b(\y->c(d y))e(f g h(\z->i j(k z))(l(\q->m(\w->n(o w))(p q))x)))
kurallar
- Çıktınızda, dengeli olduğu sürece gerekenden daha fazla alan veya parantez olabilir
- Oluşturduğunuz değişkenin adının
\x
kodda başka bir yerde kullanılmadığından emin olmanız gerekmez - Bir işlev veya tam bir program oluşturmak sizin seçiminizdir
- Bu
codegolf
, bayttaki en kısa kod kazanır!
Künt yararlı olabilir, iki gösterim arasında dönüşür (ancak mümkün olduğunda kodu çarpanlarına ayırır): https://blunt.herokuapp.com
(+).(*3)
aynı\x y->3*x+y
(.).(.)
dönüştürmek\i b c f -> i (b c f)
.
ile değiştirin (
, a'nın başına \x
ekleyin ve karşılık gelen x
ve gerektiği kadar ekleyin )
? Yoksa bundan daha mı karmaşık?
\ d->f(\k->f(f d k))
, ancak bu meydan okumada tüm noktaların iki argümanla beslendiğini varsayabilirsiniz