Как вам скорее всего известно, написать представителя класса типов Functor для типа эндоморфизма невозможно. Если неизвестно, то можете попробовать
newtype Endo a = Endo (a -> a)
instance Functor Endo where
fmap f (Endo g) = Endo undefined
Даже если ваш результат сойдется по типам, законам для функтора он удовлетворять не будет.
Вот вам другой
(
Read more... )
Comments 16
Reply
Reply
Reply
https://gist.github.com/thedeemon/ddf63573f089dff61aae
Просто по типам разворачиваешь, не думая.
Reply
Reply
Reply
Reply
А ещё это (совершенно законная) монада. Очень интересная.
Reply
(a -> b) -> b знаю, а (a -> b) -> a - не знаю :(
Reply
В Хаскеле можно определит натуральные числа, как в Пиановской арифметике:
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
Reply
Reply
Leave a comment