
Evgeniy
13.09.2017
08:52:02
что тут функторы?

Yuriy
13.09.2017
08:52:30
в категории монад (точнее, просто морфизмов типов) как объектов и морфизмов морфизмов типов (например, монадных трансформеров) как стрелок
о функторах в этой категории лучше пока не думать
ТК-функторы — они вообще не в категории, а между категориями

Google

Yuriy
13.09.2017
08:54:15
так что здесь их нет

Evgeniy
13.09.2017
08:55:51
> так что здесь их нет
да это понятно
не понятно по чему эта стрелка есть морфизм между монадами

Yuriy
13.09.2017
08:56:24
объекты этой категории — эндофункторы в категории (Type, ->)

Evgeniy
13.09.2017
08:58:42
я понял что определение стрелки в этой категории оно вот ближе к монадному трансформеру

Yuriy
13.09.2017
08:58:43
монадный трансформер — частный случай

Evgeniy
13.09.2017
08:59:20
а тк трансформер он тоже type->type то это может быть так заэнкоженно?

Yuriy
13.09.2017
08:59:32
тут скорее функторный трансформер

Evgeniy
13.09.2017
09:02:49
мы же пытаемся это все в Hask изобразить, по этому вот и получается что в конечном счете у навсе все морфизмы тут type->type
у меня конечно после того как вышли за рамки Hask мозг сломался
> потому что монада — это частный случай морфизма типов

Google

Evgeniy
13.09.2017
09:06:34
а вот это мне прояснило картину
спасибо

Yuriy
13.09.2017
09:12:06
или как это правильно называется?
монада (хаскелльная) m является стрелкой из а в m a, но её тип Type -> Type является стрелкой из Type в себя
для сорта Type -> Type нельзя написать instance Category, но можно для (~>), который ему изоморфен (впрочем, я не уверен, что действительно изоморфен)

kana
13.09.2017
09:58:12
Не могу понять, почему кайнд переводят как сорт. Ну напрашивается же "вид". Функция вида..., тип вида...

Евгений
13.09.2017
10:07:20
Давайте переводить "порода"

? animufag ?
13.09.2017
10:07:42
добро

kana
13.09.2017
10:09:40
Я предпочитаю старое русское слово кайнд

Yuriy
13.09.2017
10:45:26
кайнд — это же тип₂? или тип₁?

? animufag ?
13.09.2017
11:17:55
Тогда там наверное есть тип0

Yuriy
13.09.2017
11:43:47
кайнды — термы2, типы — термы1, значения — термы0

Index
13.09.2017
11:48:45
Нельзя сказать, что типы — это тёрмы_1
Эта иерархия (тип0, тип1, тип2) не затрагивает термы

Yuriy
13.09.2017
11:52:43
уровни термов я скопировал с изменениями из https://www.cs.cmu.edu/~kw/scans/hurkens95tlca.pdf, возможно, направильно

Index
13.09.2017
11:57:19
Я не исключаю, что такая формальная система возможна (пейпер не читал и сейчас не хочется), просто это не то, что делают proof assistants сегодняшние.

Yuriy
13.09.2017
12:00:01
а что делают сегодняшние?
кажется, я где-то читал про бесконечный ряд Type_n :: Type_{n+1}, и как TypeInType отождествляет их все, но сейчас не могу найти

Index
13.09.2017
12:01:33
так и есть, просто это не с тёрмов начинается

Google

Index
13.09.2017
12:01:49
имеем тёрмы, а потом тип0, тип1, тип2, тип3, etc
с type-in-type имеем тёрмы, потом типы (зацикленные в себя)

Denis
13.09.2017
17:10:45
а тут все рекурсивные схемы обсуждают)

Bohdan
13.09.2017
19:45:16
ghc умеет кросс-компиляцию под винду?

? animufag ?
13.09.2017
21:54:05

Sherzod
14.09.2017
01:56:36

Yuriy
14.09.2017
04:34:56

Aragaer
14.09.2017
04:36:34
-C Stop after generating C (.hc file)
дальше берется нужный кросс-компилятор С
и семейство флагов -pgm*

Yuriy
14.09.2017
04:46:17
а в какой момент кабал будет вычислять "if win32"?

Leonid
14.09.2017
08:20:52
без кабала, ghc -make и вперде

Alexandr
14.09.2017
12:57:45
Всем привет! Как можно создать инстанс для тайпкласса/тайпклассов? Что-то вроде
class Foo a where
bar :: a -> Bool
instance (Ord a, Num a) => Foo a where
bar n = n > 10

Kirill
14.09.2017
12:58:56
А что должно помешать?

Aleksey
14.09.2017
12:59:19
Будет ругать на ограничение в инстансе, которого (ограничения) нет в классе

Oleg
14.09.2017
12:59:24
Полагаю, такой конкретно инстанс корректен только если нет ни одного другого

Kirill
14.09.2017
13:00:29
моноиды же так объявлены

Aleksey
14.09.2017
13:01:09
Там ограничение - тоже Моноид
Это как раз логично

Alexandr
14.09.2017
13:01:42
для этого будет ошибка
error:
• Illegal instance declaration for 'Foo a'
(All instance types must be of the form (T a1 ... an)
where a1 ... an are *distinct type variables*,
and each type variable appears at most once in the instance head.
Use FlexibleInstances if you want to disable this.)
• In the instance declaration for 'Foo a'

Google

Oleg
14.09.2017
13:01:58
Use FlexibleInstances

Kirill
14.09.2017
13:02:04
дык да: FlexibleInstances

Aleksey
14.09.2017
13:02:09
Ага, компилятор даже подсказывает, что включить

Alexandr
14.09.2017
13:02:14
ну это от части помогает, но потом
error:
• The constraint 'Ord a' is no smaller than the instance head
(Use UndecidableInstances to permit this)
• In the instance declaration for 'Foo a'

Kirill
14.09.2017
13:02:34
» UndecidableInstances

Aleksey
14.09.2017
13:02:38
Ага
Но могут быть проблемы с выводом типов - он не завершится (зациклится) :)

Kirill
14.09.2017
13:03:44
я вроде что-то подобное делал и вполне работало

Aleksey
14.09.2017
13:03:58
Оно работает пока не сломается :)
Я про UndecidableInstances

Kirill
14.09.2017
13:04:09
Лол

Oleg
14.09.2017
13:04:11
да, на простом всё норм

Alexandr
14.09.2017
13:04:17
а есть норм вики про прагмам?

Aleksey
14.09.2017
13:04:28
Есть - дока по GHC

Vasiliy
14.09.2017
13:04:46
говорят, что UndecidableInstances никаких проблем не влечёт
проблемы от IncoherentInstances

Oleg
14.09.2017
13:05:01

Aleksey
14.09.2017
13:05:23
Ну потенциально компилер может запомнить, что он уже нашел инстанс для некоего типа, но не обязан - это я про "is no smaller than"

Google

Alexandr
14.09.2017
13:07:09
у меня была такая проблема с кодом, я сделал newtype для Int, потом засунул его в bar и вышла ошибка, о том, что есть несколько инстансов
ща
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE UndecidableInstances #-}
class Foo a where
bar :: a -> Bool
newtype Int' = Int' Int deriving (Eq, Show, Foo)
instance (Num a, Ord a) => Foo a where
bar n = n > 10

Oleg
14.09.2017
13:09:39
Ну правильно
ты пытаешь вывести инстанс для Int', в то время как ниже объявляешь инстанс для всех типов вообще
они пересекаются

Aleksey
14.09.2017
13:10:11
Надо параметризовать ньютайп

Oleg
14.09.2017
13:10:35
засунь тогда нижний инстанс тоже в ньютайп

Aleksey
14.09.2017
13:12:08
нижний инстанс вообще не отностится к Int' никак, т.к. ньютайп не инстанциирует орд и не нум
Но т.к. инстанс - всеядный, то получется, он подходит и для Int'

Oleg
14.09.2017
13:12:38

Alexandr
14.09.2017
13:12:45
просто выходит, что если объявить инстанс для инта, то тогда все задервайвится и будет работать, но при этом не будет возможности использовать bar для любых Ord, Num

Oleg
14.09.2017
13:12:55
нижний инстанс может существовать только в единственном числе

Aleksey
14.09.2017
13:14:04
class Foo a where
bar :: a -> Bool
newtype Fooable a =
Fooable a deriving (Eq, Show, Foo)
instance (Num a, Ord a) => Foo (Fooable a) where
bar (Fooable n) = n > 10

Oleg
14.09.2017
13:14:42