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-19 07:41 pm (UTC)
From: [identity profile] voidex.livejournal.com
http://hpaste.org/67298
Edited Date: 2012-04-19 07:43 pm (UTC)

Date: 2012-04-19 08:06 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
Да, пойдёт. Моя версия http://hpaste.org/67300

Date: 2012-04-19 08:17 pm (UTC)
From: [identity profile] voidex.livejournal.com
Ваша получше :)

Date: 2012-04-19 08:21 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
Ещё, кстати, можно подумать над тем, чтобы нарушался только один из законов: Composition или Interchange.

Date: 2012-04-19 09:13 pm (UTC)
From: [identity profile] voidex.livejournal.com
А это у меня как раз сразу получилось :)

http://hpaste.org/67305

Остался последний вариант.

Date: 2012-04-19 09:33 pm (UTC)

Date: 2012-04-20 10:08 am (UTC)
From: [identity profile] migmit.livejournal.com
import Control.Applicative
data B a = B Bool Bool a deriving Show
instance Functor B where fmap h u = pure h <*> u
instance Applicative B where
    pure = B True True
    B b1 k1 f <*> B b2 k2 a = B (if k1 || k2 then b2 else b1) k2 (f a)
{-
pure id <*> B b k a
= B True True <*> B b k a = B b k a

pure f <*> pure a
= B True True f <*> B True True a
= B True True (f a)
= pure (f a)

B True False id <*> pure 0
= B True False id <*> B True True 0
= B True True 0

pure ($ 0) <*> B True False id
= B True True ($ 0) <*> B True False id
= B True False 0

pure (.) <*> B True False id <*> B False True id <*> B False False 0
= ((B True True (.) <*> B True False id) <*> B False True id) <*> B False False 0
= (B True False (id .) <*> B False True id) <*> B False False 0
= B False True id <*> B False False 0
= B False False 0

B True False id <*> (B False True id <*> B False False 0)
= B True False id <*> B False False 0
= B False False 0
-}

Date: 2012-04-20 10:20 am (UTC)
From: [identity profile] migmit.livejournal.com
Блин, в девятой строчке id пропустил.

Date: 2012-04-20 11:12 am (UTC)
From: [identity profile] migmit.livejournal.com
Дважды блин, в предпоследней строчке должно быть "B True False 0"

Date: 2012-04-20 11:19 am (UTC)
From: [identity profile] deni-ok.livejournal.com
Вот да, я сижу, думаю, что же результат двух последних выкладок значит :)

Date: 2012-04-20 11:37 am (UTC)
From: [identity profile] deni-ok.livejournal.com
Идея, кстати, замечательная - не играть структурами, а просто оборудовать булевым такелажем для руления.

Date: 2012-04-20 02:59 pm (UTC)
From: [identity profile] voidex.livejournal.com
Это чит! :)

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. 17th, 2025 04:29 am
Powered by Dreamwidth Studios