Який найкоротший спосіб ми можемо виразити функцію
f(a,b)(c,d)=(a+c,b+d)
у точковій нотації?
pointfree.io дає нам
uncurry (flip flip snd . (ap .) . flip flip fst . ((.) .) . (. (+)) . flip . (((.) . (,)) .) . (+))
які за допомогою трохи роботи можна скоротити
uncurry$(`flip`snd).((<*>).).(`flip`fst).((.).).(.(+)).flip.(((.).(,)).).(+)
за 76 байт. Але це все ще здається дійсно довгим і складним для такого простого завдання. Чи є якийсь спосіб ми можемо висловити парне додавання як більш коротку функцію без точок?
Щоб було зрозуміло, що я маю на увазі під точковою, без точкової декларації функції передбачає взяття існуючих функцій та операторів та застосування їх один до одного таким чином, що створюється потрібна функція. Зворотні лапки, дужки і буквальні значення ( []
, 0
, [1..3]
і т.д.) допускається , але ключові слова , як where
і let
немає. Це означає:
Ви не можете призначити будь-які змінні / функції
Ви не можете використовувати лямбда
Ви не можете імпортувати
(+)***(+)
.
(+)<$>([1],2)<*>([3],4)
дає ([1,3],6)
.