Size: a a a

2021 January 16

O

Ortofax in Haskell
источник

O

Ortofax in Haskell
только трансформация монад это же не про ma1 a -> m2 b, а про Type -> Type
источник

X

XÆA-XII in Haskell
Ortofax
только трансформация монад это же не про ma1 a -> m2 b, а про Type -> Type
Так тип изменится
UPD а может и не изменяться
источник

X

XÆA-XII in Haskell
Но при этом можно задать нужную логику трансформации и даже после изменения сигнатуры будет можно использовать >>= так, как мы привыкли
источник

O

Ortofax in Haskell
ну допустим у нас >>=, который внутри делает лифт

> трансформаторы монад были бы не нужны
так а всё же, как тогда композить монады-то?
источник

X

XÆA-XII in Haskell
Не знаю
источник

X

XÆA-XII in Haskell
Не думал об этом
источник

O

Ortofax in Haskell
кроме того, у >>= сигнатура не совсем такая, она Monad m => m a -> (a -> m b) -> m b
какая должна быть сигнатура у того другого варианта?
источник

O

Ortofax in Haskell
ещё, отвечая на вопрос "почему" - потому что это _моноид_ в категории эндофункторов, лол.
источник

X

XÆA-XII in Haskell
Ortofax
ещё, отвечая на вопрос "почему" - потому что это _моноид_ в категории эндофункторов, лол.
Типа, моноид относительно операции >>=?
источник

O

Ortofax in Haskell
не, моноид образуют return и join, а >>= это вещь производная при такой формулировке
источник

X

XÆA-XII in Haskell
Понял
источник

X

XÆA-XII in Haskell
Спасибо за объяснение
источник

O

Ortofax in Haskell
ну типа return :: Identity a -> m a это единица, join :: (m :.: m) a-> m a это бинарная операция, m это носитель
источник

A

Aleksandr Khristenko in Haskell
XÆA-XII
А почему (>>=) имеет сигнатуру m a -> (a -> m b) -> m b, а не m1 a -> (a -> m2 b) -> m2 b? При таком раскладе событий трансформаторы монад были бы не нужны, так как трансформировать монады можно было бы просто с помощью >>=
Но нужно будет писать такую функцию для каждой пары m1 и m2
источник

JS

Jerzy Syrowiecki in Haskell
XÆA-XII
А почему (>>=) имеет сигнатуру m a -> (a -> m b) -> m b, а не m1 a -> (a -> m2 b) -> m2 b? При таком раскладе событий трансформаторы монад были бы не нужны, так как трансформировать монады можно было бы просто с помощью >>=
чтобы композить элементы одной монады.

а вы хотите разные монады соединять. вот здесь выше упоминали пакет supermonad, есть ещё indexed
источник

ЖК

Жук Короед in Haskell
Пытаюсь понять DerivingVia, но что-то непонятное происходит:
data Rad n where
Rad :: (Coercible Double n, RealFloat n)
=> n -> Rad n
deriving RealFloat via Double
GHC жалуется:

* Couldn't match representation of type `Double'
                          with that of `Deg n'
   arising from the coercion of the method `floatRadix'
     from type `Double -> Integer' to type `Deg n -> Integer'
* When deriving the instance for (RealFloat (Deg n))

Почему не совпадает, если я указал, что n и Double Coercible? Только потому, что не newtype, а data?
источник

АХ

Алексей Худяков... in Haskell
Да. Ньютайпы имеют одинаковое представление и потому их можно коерцить друг к другу. Дату нельзя
источник

к

кана in Haskell
ну, это конечно основная причина, но даже если бы было можно коерсить из даты в значения внутри (что наверное можно сделать в строгом случае), то нужно еще не забывать, что Rad - это тройка, внутри Rad лежат два инстанса и Double (возможно Coercible инстанс стирается, и лежит только один инстарнс и Double)

пара из инстанса и Double никак не матчится с просто Double
источник

ЖК

Жук Короед in Haskell
Ого, не знал, что информация об инстансах лежит в рантайме вместе с данными. Познавательно 👀
источник