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

Mar 26, 2015 21:28

Циклическую ротацию списка влево

> 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 ровно ( Read more... )

haskell, сборник задач и упражнений по Хаскелю, fp

Leave a comment

Comments 13

voidex March 26 2015, 18:33:24 UTC
rotate = (uncurry (flip (++)) .) . splitAt

Reply

deni_ok March 26 2015, 19:04:36 UTC
Это симпатично, но тут пять библиотечных функций, а (.) еще и использована 2 раза. А можно уложиться в три.

Reply


helvegr March 26 2015, 19:03:32 UTC

drop `mappend` take

Reply

deni_ok March 26 2015, 19:06:05 UTC
Ага. Классный инстанс моноида, еще и примененный сам к себе.

Reply

vshabanov March 27 2015, 00:32:50 UTC
Прикольно, век живи -- век учись.

Reply

lomeo March 27 2015, 12:59:30 UTC
Охренеть!

Reply


sassa_nf March 26 2015, 19:55:16 UTC
Вообще-то, если бы у нас был встроенный instance (Applicative f, Applicative g) => Applicative (Compose f g), то было бы достаточно кратко: liftA2 (++) drop take

Reply

deni_ok March 26 2015, 20:25:01 UTC
Это все равно 4 библиотечных функции. А без встроенных и того больше:

getCompose (liftA2 (++) (Compose drop) (Compose take))

Reply

sassa_nf March 26 2015, 21:17:19 UTC
в смысле? если бы была встроенная type-level композиция (как в Агде), то было бы на всего одну функцию больше. Вместо mappend было бы liftA2 (++).

Reply

deni_ok March 27 2015, 06:36:38 UTC
Да, все так, я и не возражаю, просто занимаюсь начетничеством.

Reply


lomeo March 27 2015, 12:57:35 UTC
rotate = liftM2 (liftM2 (++)) drop take
ну или liftA2

Reply


rumataestor March 30 2015, 01:16:14 UTC
А что такого хорошего в point-free, чтобы изымать из кода документирующие смысл идентификаторы параметров?

Reply

deni_ok March 30 2015, 07:11:27 UTC
Мы можем смотреть на вычисления с разных сторон. Если есть действительно компактная point-free реализация, то это намекает на то, что смысл данного вычисления удобно выражать в терминах проявившегося интерфейса.

Reply


Leave a comment

Up