Какой самый короткий способ выразить функцию
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)
.