Экспоненциальное офункторивание

Nov 05, 2015 22:33

Как вам скорее всего известно, написать представителя класса типов Functor для типа эндоморфизма невозможно. Если неизвестно, то можете попробовать
newtype Endo a = Endo (a -> a) instance Functor Endo where fmap f (Endo g) = Endo undefined Даже если ваш результат сойдется по типам, законам для функтора он удовлетворять не будет.

Вот вам другой ( Read more... )

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

Leave a comment

Comments 16

nponeccop November 5 2015, 19:56:15 UTC
Если чо, (->) бифунктор. Т.е. есть более простой способ экспоненциально офункторить.

Reply

deni_ok November 5 2015, 20:39:48 UTC
Бифунктор по-кметтовски ковариантен по обоим параметрам. А (->) - это профунктор. Хотя это все вопрос терминологии.

Reply

nponeccop November 5 2015, 20:56:45 UTC
ошибся. Профунктор, конечно

Reply


thedeemon November 6 2015, 04:14:27 UTC
42
https://gist.github.com/thedeemon/ddf63573f089dff61aae
Просто по типам разворачиваешь, не думая.

Reply

deni_ok November 6 2015, 11:36:59 UTC
А если напустить на эту лямбду pointfree (связав предварительно еще и переменные, которые слева от равенства - как бы снимая упаковку/распаковку в newtype), то оказывается, что этот fmap - очень симметричный liftM в примитивном ридере.

Reply


migmit November 6 2015, 07:02:33 UTC
Блин, я сначала подумал, что твоё undefined - и есть предлагаемая тобой реализация.

Reply

deni_ok November 6 2015, 11:39:02 UTC
Я противозаконными реализациями стараюсь не грешить!

Reply

migmit November 6 2015, 12:21:34 UTC
Это правильно.

А ещё это (совершенно законная) монада. Очень интересная.

Reply

deni_ok November 6 2015, 12:55:31 UTC
Ничесе!

(a -> b) -> b знаю, а (a -> b) -> a - не знаю :(

Reply


papa_lyosha November 6 2015, 22:32:22 UTC
Если вам интересны задачи по Хаскелю, то как вам такая задача?
В Хаскеле можно определит натуральные числа, как в Пиановской арифметике:

data Natural = Zero | S Natural

Легко написать instance Num Natural, instance Ord Natural, instance Show Natural, и т.д.

Фактически такой тип Natural это тип натуральных чисел, записанных в унарной системе. Вообще-то унарная система сильно не эффективна. Тем не менее, как это ни странно, существуют естественные ситуации, когда такое представление чисел оказывается более эффективным! Вот смотрите:

Prelude Data.Number.Natural> :t f
f :: (Num a, Ord a) => a -> Bool
Prelude Data.Number.Natural> f (10^5 :: Natural)
True
(0.01 secs, 32896040 bytes)
Prelude Data.Number.Natural> f (10^5 :: Integer)
True
(2.44 secs, 1934967184 bytes)
Prelude Data.Number.Natural> f (10^5 :: Int)
True
(2.17 secs, 2094407992 bytes)
Prelude Data.Number.Natural>

Задача: придумать такую функцию f, которая работала бы одинаково для натуральных чисел из Natural, Integer и Int (конечно для чисел меньше maxBound::Int), но при ( ... )

Reply

migmit January 14 2016, 10:19:09 UTC
Он Пеано.

Reply

papa_lyosha January 17 2016, 07:29:40 UTC
Да, конечно

Reply


Leave a comment

Up