?

Log in

Долой кровавую ведьму!

Jan. 21st, 2017

09:55 pm - Дональд или Хилари?

Мнения просвещенных твиттерян разделились поровну. Соперники идут ноздря в ноздрю.

Присоединяйтесь, кто еще не.

Originally posted at http://deniok.dreamwidth.org/64617.html. Feel free to comment here or there.

Nov. 18th, 2016

09:37 pm - Ратный труд обертки-композитора

Как известно композиция двух функторов является функтором, причем fmap для этой композиции - это композиция fmap'ов:

GHCi> (fmap . fmap) (^2) [Just 3,Just 5,Nothing]
[Just 9,Just 25,Nothing]
Левый fmap протаскивает свой аргумент (fmap (^2)) через конструкторы списка, а дальше оставшийся fmap протаскивает свой аргумент (^2) через конструкторы Maybe.

а фолды? траверсы? аппликативы? монады?...Collapse )

Nov. 6th, 2016

10:47 pm - Minimal Incomplete Definition

data Id a = Id {runId :: a} deriving (Eq,Show)

instance Traversable Id where
  sequenceA (Id x) = pure Id <*> x
 
instance Functor Id where
  fmap = fmapDefault

instance Foldable Id where
  foldMap = foldMapDefault
Какие неожиданные эффекты будут сопровождать следующий вызов, и в чем их причина?
GHCi> traverse Just (Id 5)

12:55 pm - Не допускайте потери неоднозначности

Часто парсеры пишут в виде, допускающем разбор неоднозначных грамматик

newtype Parser a = Parser { apply :: String -> [(a, String)] }
(Тип apply это не что иное, как стандартный ReadS.) Однако, начав таким образом, лучше быть консистентным, поддерживая эту возможность повсюду, например
parse :: Parser a -> String -> [a]
parse p = map fst . filter (null . snd) . apply p
Сделайте приведенный выше парсер представителем Applicative и Alternative, так чтобы обеспечить следующее поведение
> twoChars x = (\a b -> [a,b]) <$> char x <*> char x
> threeChars x = (\a b c -> [a,b,c]) <$> char x <*> char x <*> char x
> parse (some (twoChars '7') <|> some (threeChars '7')) "777777"
[["77","77","77"],["777","777"]]
(Парсер char, конечно, еще потребуется, но тут, надеюсь, все справятся.)

Sep. 16th, 2016

09:51 am - Предвыборное

Originally posted by edwardahirsch at Предвыборное

Если что, в воскресенье я собираюсь придти и проголосовать за Яблоко и яблочных депутатов всеми четырьмя бюллетенями.

Начало федерального списка у них неплохое, и никакой агитации за других разумных кандидатов я не видел. Ну, и вообще, яблочный год и время собирать камни.

Чего и вам желаю.

Jul. 27th, 2016

02:01 pm - Свернуть сворачиваемое в альтернативу

В стандартной библиотеке (Data.Foldable) имеется функция

> :t asum
asum :: (Alternative f, Foldable t) => t (f a) -> f a
> asum [Nothing, Just 1, Just 2]
Just 1
> asum [[1,2,3],[4,5]]
[1,2,3,4,5]
Можете ли вы написать afold с естественной для своего типа семантикой:
> :t afold
afold :: (Alternative f, Foldable t) => t a -> f a
>  afold "abc" :: Maybe Char
Just 'a'
>  afold "abc" :: [Char]
"abc"
Я знаю три решения: кривое (требующее FlexibleInstances и IncoherentInstances), обычное (утилизирующее избыточно богатый интерфейс Foldable) и современное, элегантно выпрямляющее кривизну кривого.

Jul. 23rd, 2016

11:23 am - Собрал все в одном месте...

... и педантично выровнял:

($)    ::                      (a -> b) ->   a ->   b
(<$>)  :: Functor     f  =>    (a -> b) -> f a -> f b
(<*>)  :: Applicative f  =>  f (a -> b) -> f a -> f b
(=<<)  :: Monad       m  =>  (a -> m b) -> m a -> m b

(&)    ::                      a ->   (a -> b) ->   b  -- Data.Function
(<&>)  :: Functor     f  =>  f a ->   (a -> b) -> f b  -- Control.Lens.Operators
(<**>) :: Applicative f  =>  f a -> f (a -> b) -> f b  -- Control.Applicative
(>>=)  :: Monad       m  =>  m a -> (a -> m b) -> m b

Tags: ,

Jun. 18th, 2016

12:17 am - Кишки наружу

Все-таки оставили:

GHCi> :i ($)
($) ::
  forall (r :: GHC.Types.RuntimeRep) a (b :: TYPE r).
  (a -> b) -> a -> b
        -- Defined in `GHC.Base'
infixr 0 $
GHCi> :i undefined
undefined ::
  forall (r :: GHC.Types.RuntimeRep) (a :: TYPE r).
  GHC.Stack.Types.HasCallStack =>
  a
        -- Defined in `GHC.Err'
Хорошо хоть
> :t ($)
($) :: (a -> b) -> a -> b
> :t undefined
undefined :: a

Tags: ,

Jun. 12th, 2016

07:01 pm - Инфиксный аналог fmap

В выражении

GHCi> succ <$> "abc"
"bcd"
оператор <$> имеет тип (Char -> Char) -> [Char] -> [Char]. Верно ли это утверждение для обоих вхождений <$> в следующем выражении
GHCi> succ <$> succ <$> "abc"
"cde"

Apr. 7th, 2016

12:00 pm - id да не id

Приведите пример таких объявлений типа данных с конструктором данных T и сигнатуры функции f, что реализация

f (T x) = T x
проходила бы проверку типов, a
f x = x
нет.

Navigate: (Previous 10 Entries)