deniok: (Default)
[personal profile] deniok
Напишите представителя класса типов Applicative, для которого выполнялись бы законы Identity и Homomorphism:
pure id <*> u = u
pure u <*> pure x = pure (u x)
но не выполнялся бы законы Composition и/или Interchange:
pure (.) <*> u <*> v <*> x = u <*> (v <*> x)
u <*> pure x = pure ($ x) <*> u


UPD. Ну и по ходу дела возникли бонусные вопросы: написать такого представителя, чтобы не выполнялся (a) только Composition; (b) только Interchange.

Date: 2012-04-20 03:38 pm (UTC)
From: [identity profile] migmit.livejournal.com
Собственно, не обязательно булевым (ох, нравится мне твоя терминология). Можно любым:
class Rigging r where
  rpure :: r
  rjoin :: r -> r -> r
data WithRigging r a = WithRigging r a
instance Functor (WithRigging r) where
  fmap h (WithRigging r a) = WithRigging r (h a)
instance Rigging r => Applicative (WithRigging r) where
  pure = WithRigging rpure
  WithRigging r1 f <*> WithRigging r2 a = WithRigging (rjoin r1 r2) (f a)

Тогда Identity - это то, что rpure является левой единицей для rjoin, Homomorphism - это более узкое свойство rjoin rpure rpure = rpure, Composition - ассоциативность rjoin (при условии, что Identity выполняется), а Interchange - коммутативность.
Edited Date: 2012-04-20 03:39 pm (UTC)

Date: 2012-04-20 04:38 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
Моноидальный такелаж - новое слово в яхтенном спорте!

Profile

deniok: (Default)
deniok

February 2022

S M T W T F S
  12345
6789101112
13141516171819
20212223 242526
2728     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 22nd, 2025 09:46 am
Powered by Dreamwidth Studios