deniok: (typed lambda)
deniok ([personal profile] deniok) wrote2015-03-26 09:28 pm

Крутим список кратко и бесточечно

Циклическую ротацию списка влево
> rotate 3 [1..10]
[4,5,6,7,8,9,10,1,2,3]
легко определить, используя take и drop:
> let rotate n xs = drop n xs ++ take n xs
Если напустить на это дело pointfree, он даст безумное:
rotate = ap (ap . ((++) .) . drop) take


Можете ли вы написать полностью бесточечную реализацию rotate, сцепив take и drop ровно одной стандартной библиотечной функцией?

[identity profile] voidex.livejournal.com 2015-03-26 06:33 pm (UTC)(link)
rotate = (uncurry (flip (++)) .) . splitAt
Edited 2015-03-26 18:33 (UTC)

[identity profile] deni-ok.livejournal.com 2015-03-26 07:04 pm (UTC)(link)
Это симпатично, но тут пять библиотечных функций, а (.) еще и использована 2 раза. А можно уложиться в три.

[identity profile] helvegr.livejournal.com 2015-03-26 07:03 pm (UTC)(link)
drop `mappend` take

[identity profile] deni-ok.livejournal.com 2015-03-26 07:06 pm (UTC)(link)
Ага. Классный инстанс моноида, еще и примененный сам к себе.

[identity profile] vshabanov.livejournal.com 2015-03-27 12:32 am (UTC)(link)
Прикольно, век живи -- век учись.

[identity profile] lomeo.livejournal.com 2015-03-27 12:59 pm (UTC)(link)
Охренеть!

[identity profile] sassa-nf.livejournal.com 2015-03-26 07:55 pm (UTC)(link)
Вообще-то, если бы у нас был встроенный instance (Applicative f, Applicative g) => Applicative (Compose f g), то было бы достаточно кратко: liftA2 (++) drop take

[identity profile] deni-ok.livejournal.com 2015-03-26 08:25 pm (UTC)(link)
Это все равно 4 библиотечных функции. А без встроенных и того больше:
getCompose (liftA2 (++) (Compose drop) (Compose take))

[identity profile] sassa-nf.livejournal.com 2015-03-26 09:17 pm (UTC)(link)
в смысле? если бы была встроенная type-level композиция (как в Агде), то было бы на всего одну функцию больше. Вместо mappend было бы liftA2 (++).

[identity profile] deni-ok.livejournal.com 2015-03-27 06:36 am (UTC)(link)
Да, все так, я и не возражаю, просто занимаюсь начетничеством.

[identity profile] lomeo.livejournal.com 2015-03-27 12:57 pm (UTC)(link)
rotate = liftM2 (liftM2 (++)) drop take
ну или liftA2

[identity profile] rumataestor.livejournal.com 2015-03-30 01:16 am (UTC)(link)
А что такого хорошего в point-free, чтобы изымать из кода документирующие смысл идентификаторы параметров?

[identity profile] deni-ok.livejournal.com 2015-03-30 07:11 am (UTC)(link)
Мы можем смотреть на вычисления с разных сторон. Если есть действительно компактная point-free реализация, то это намекает на то, что смысл данного вычисления удобно выражать в терминах проявившегося интерфейса.