deniok: (typed lambda)
[personal profile] deniok
Циклическую ротацию списка влево
> 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 ровно одной стандартной библиотечной функцией?

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

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

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

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

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

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

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

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

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

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

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

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

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

Profile

deniok: (Default)
deniok

April 2017

S M T W T F S
      1
23 45678
9101112131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 27th, 2017 02:31 am
Powered by Dreamwidth Studios