Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/1: Рейтинг темы: голосов - 1, средняя оценка - 5.00
82 / 75 / 10
Регистрация: 12.08.2019
Сообщений: 81

Справедлив ли мой инстанс класса ArrowApply?

10.11.2021, 13:17. Показов 588. Ответов 0

Студворк — интернет-сервис помощи студентам
Пока что я тренируюсь для себя, изучаю стрелки на примере Контуров CircuitT. Я пока не приобрёл "зрение", которым я мог бы видеть справедливость законов, то, как это работает, пишу ли я полную чепуху или нет и т.п. Я пока просто играю в Тетрис Типов и параллельно осваиваю arrow proc do нотацию. На Hackage есть эквивалент моему трансформеру, но у него нет инстанса ArrowApply. Я написал инстанс, но там приходится использовать функцию snd, которая отрубает новый обновлённый Контур типа CircuitT a b c, что похоже на потерю информации, ради которой этот трансформер и придумали. Возможно именно из-за этого на Hackage нет инстанса.

Вопрос: хорошая ли у меня реализация или нет? Если нет, то была ли проблема в обрубании нового контура или в чём-то другом?

Часть минимально необходимого кода.
Кликните здесь для просмотра всего текста
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{-# LANGUAGE Arrows #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE TupleSections #-}
module CircuitTrans where
import Control.Arrow
import Control.Category ( Category(..) )
import Prelude hiding (id, (.))
 
newtype CircuitT a b c = CircuitT {runCircuitT :: a b (CircuitT a b c, c)}
 
instance (Arrow a) => Category (CircuitT a) where
    id = CircuitT $ id >>^ (id,)
    CircuitT bc . CircuitT ab = CircuitT $ proc a -> do
        (ab', b) <- ab -< a
        (bc', c) <- bc -< b
        returnA -< (bc' . ab', c)
 
instance (Arrow a) => Arrow (CircuitT a) where
    arr f = CircuitT $ (arr f,) ^<< arr f
    first (CircuitT bc) = CircuitT $ proc (b, d) -> do
        (x, c) <- bc -< b
        returnA -< (first x, (c, d))
 
instance (ArrowApply a) => ArrowApply (CircuitT a) where
    -- app = CircuitT $ ((app,) <<< snd) ^<< app <<^ first runCircuitT
    -- Так тоже можно
    app :: CircuitT a (CircuitT a b c, b) c
    app = CircuitT $ proc (CircuitT abc, b) -> do
        c <- app -< (abc, b)
        returnA -< (app, snd c)
Весь код как он есть.
Кликните здесь для просмотра всего текста
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
{-# LANGUAGE Arrows #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE InstanceSigs #-}
module CircuitTrans where
import Control.Arrow
import Control.Arrow.Operations
import Control.Arrow.Transformer.Stream ( ArrowAddStream(liftStream) )
import Control.Arrow.Transformer ( ArrowTransformer(..) )
import Control.Category ( Category(..) )
import Prelude hiding (id, (.))
import Control.Applicative
 
 
 
newtype CircuitT a b c = CircuitT {runCircuitT :: a b (CircuitT a b c, c)}
 
instance (Arrow a) => Functor (CircuitT a b) where
    fmap f (CircuitT c) = CircuitT $ (fmap f *** f) ^<< c
 
instance (Arrow a) => Applicative (CircuitT a b) where
    pure = arr . const
    cf <*> ca = uncurry ($) ^<< (cf &&& ca)
 
instance (ArrowPlus a) => Alternative (CircuitT a b) where
    empty = zeroArrow
    (<|>) = (<+>) 
 
instance (ArrowApply a) => Monad (CircuitT a b) where
    ab >>= fbac = (ab >>^ fbac) &&& id >>> app
 
instance (Arrow a) => Category (CircuitT a) where
    id = CircuitT $ id >>^ (id,)
    CircuitT bc . CircuitT ab = CircuitT $ proc a -> do
        (ab', b) <- ab -< a
        (bc', c) <- bc -< b
        returnA -< (bc' . ab', c)
 
instance (Arrow a) => Arrow (CircuitT a) where
    arr f = CircuitT $ (arr f,) ^<< arr f
    first (CircuitT bc) = CircuitT $ proc (b, d) -> do
        (x, c) <- bc -< b
        returnA -< (first x, (c, d))
 
 
instance (ArrowChoice a) => ArrowChoice (CircuitT a) where
    left c@(CircuitT bc) = CircuitT $ ((left *** Left) ^<< bc) ||| arr ((left c,) . Right)
    -- left c@(CircuitT bc) = CircuitT $ proc ebd -> do
    --     ans <- (case ebd of
    --         Left b -> (left *** Left) ^<< bc -< b
    --         Right d -> arr (left c,) -< Right d)
    --     returnA -< ans
    -- Так тоже можно 
 
instance (ArrowApply a) => ArrowApply (CircuitT a) where
    -- app = CircuitT $ ((app,) <<< snd) ^<< app <<^ first runCircuitT
    -- Так тоже можно
    app :: CircuitT a (CircuitT a b c, b) c
    app = CircuitT $ proc (CircuitT abc, b) -> do
        c <- app -< (abc, b)
        returnA -< (app, snd c)
 
instance (ArrowLoop a) => ArrowLoop (CircuitT a) where
    loop (CircuitT a) = CircuitT $ proc b -> do
        rec
            (circ, (c, d)) <- a -< (b, d)
        returnA -< (loop circ, c) 
 
instance (ArrowZero a) => ArrowZero (CircuitT a) where
    zeroArrow = CircuitT zeroArrow 
 
instance (ArrowPlus a) => ArrowPlus (CircuitT a) where
    CircuitT a1 <+> CircuitT a2 = CircuitT $ a1 <+> a2
 
instance (Arrow a, Arrow (CircuitT a)) => ArrowTransformer CircuitT a where
    lift a = CircuitT $ a >>^ (lift a,) 
 
instance (ArrowPlus a) => Semigroup (CircuitT a b c) where
    (<>) = (<+>)
 
instance (ArrowPlus a) => Monoid (CircuitT a b c) where
    mempty = zeroArrow 
 
instance ArrowError r a => ArrowError r (CircuitT a) where
    raise = CircuitT raise
--     tryInUnless (CircuitT aeb) (CircuitT aebc) (CircuitT aerc) = CircuitT $ proc e -> do
--         (aeb', b) <- aeb -< e
--         (aebc', x) <- aebc -< (e, b)
--         (aeerc, y) <- aerc -< (e, r)
--         returnA -< undefined 
 
instance ArrowWriter w a => ArrowWriter w (CircuitT a) where
    write = lift write
    newWriter aeb = aeb >>^ (,mempty)
 
instance ArrowState w a => ArrowState w (CircuitT a) where
    fetch = lift fetch
    store = lift store
 
instance ArrowReader w a => ArrowReader w (CircuitT a) where
    readState = lift readState
    -- newReader = CircuitT . (first newReader ^<<) . newReader . runCircuitT
    -- Так тоже можно
    newReader (CircuitT aeb) = CircuitT $ proc ew -> do
        (cir, b) <- newReader aeb -< ew
        returnA -< (newReader cir, b)
 
instance ArrowLoop a => ArrowCircuit (CircuitT a) where
    delay b = CircuitT . arr $ (, b) . delay
 
instance (ArrowLoop a, ArrowApply a) => ArrowAddStream (CircuitT a) a where
    liftStream = lift
--     elimStream = runAutomaton
 
-- runAutomaton :: (ArrowLoop a, ArrowApply a) => CircuitT a (e,b) c -> a (e,Stream b) (Stream c)
-- runAutomaton (CircuitT f) =
--     arr (\(e, Cons x xs) -> ((e, x), (e, xs))) >>>
--     first f >>>
--     arr (\((y, c), (e, xs)) -> (y, (runAutomaton c, (e, xs)))) >>>
--     second app >>>
--     arr (uncurry Cons)



Законы Arrow Application
Кликните здесь для просмотра всего текста
Haskell
1
class Arrow a => ArrowApply a where
Some arrows allow application of arrow inputs to other inputs. Instances should satisfy the following laws:

Haskell
1
2
3
first (arr (\x -> arr (\y -> (x,y)))) >>> app = id
first (arr (g >>>)) >>> app = second g >>> app
first (arr (>>> h)) >>> app = app >>> h
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.11.2021, 13:17
Ответы с готовыми решениями:

Инстанс внутреннего статического параметризированного класса
Почему выдает ошибку, что не может выбрать статический класс из параметризированного типа? public class Outer&lt;T&gt; { ...

Как передать данные в определенный инстанс класса?
Проект который я использую https://github.com/chrisbanes/cheesesquare. Я создаю четыре экземпляра класса CheeseListFragment. Я не могу...

Выполнение метода интерфейса через инстанс класса
Добрый день. Есть такой вопрос. Допустим у меня есть интерфейс: interface Observable{ void register(); } Далее я...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.11.2021, 13:17
Помогаю со студенческими работами здесь

Как гарантировать только один инстанс класса унаследованного от виджета в Qt
Доброго времени суток. Я пытаюсь понять как гарантировать только один инстанс класса унаследованного от QDockWidget. По идеи тут...

В какой системе счисления этот пример справедлив
Дан пример на умножение,записанный в виде символьной строки,например,213*3=1144 или 2*1=2.Определить]в какой системе счисления этот пример...

Определить, в какой системе счисления данный пример справедлив
Дан пример на умножение,записанный в виде силвольной строки,например,213*3=1144.Определить,в какой системе счисления этот пример...

Определить в какой системе счисления этот пример справедлив
Дан пример на умножение,записанный в виде символьной строки,например,213*3=1144 .Определить в какой системе счисления этот пример...

Не удается получить инстанс ЭнтитиМенеджера
Решаю задачи из книги Murach's Java Servlets и столкнулся со следующей проблемой добавил в идею проэкт скачанный с сайта, загрузил в него...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru