
Alex
14.09.2017
13:56:18
есть какой нибудь флаг?

Bohdan
14.09.2017
13:57:40

Arseniy
14.09.2017
13:58:47
Да норм стикерпак получился, мемный

Donat
14.09.2017
14:00:19

Google

Bohdan
14.09.2017
14:00:46

Donat
14.09.2017
14:01:09
Чтооо

Aleksey
14.09.2017
14:01:24

Donat
14.09.2017
14:01:43

Aleksey
14.09.2017
14:02:54
http://www.willamette.edu/~fruehr/logos/intro.html тут ещё есть немного старых лого от Hugs того же и haskell.org
Можно на футболку напечатать :)
http://www.willamette.edu/~fruehr/logos/PNGs/PureFun.png

ParkeT
14.09.2017
14:07:51
https://pastebin.com/cT9ihi8v

Sherzod
14.09.2017
14:13:32
Я исправлюсь, обещяю :(

Alexander
14.09.2017
14:35:37
стикеры зло :/

Google

Alexander
14.09.2017
14:36:52
ещё гифками общаться начните с haskell тематикой
если у нас newtype вокруг Int то для него мы через GeneralizedNewtypeDeriving можем все инстансы сделать
это можем

Sherzod
14.09.2017
14:38:27
Теократы, подскажите юному падавану ютуб тутор по хаскелю )

Vasiliy
14.09.2017
14:38:51
> значит поидее можно вывести тайпкласс Foo для newtype
для этого есть GeneralizedNewtypeDeriving
и вывести инстанс Foo для любого Num можно через DefaultSignatures, как это уже показывали

Alexandr
14.09.2017
14:40:04
ничего не понял, то все не так
Ну тип, у нас есть
class Foo a where bar :: a -> Bool
Мы можем создать инстанс для Int
instance Foo Int where ...
Но наприме мы хотим инстанс не для Int, а для Num,
мы его сделали и для Int работает функция bar,
потом делаем
newtype Int' = Int' Int deriving (Foo) и это перестает работать
используя GeneralizedNewtypeDeriving конечно

Alexander
14.09.2017
14:40:36
не понимаю, что такое instance для Num

Sherzod
14.09.2017
14:41:44
Видеолекция Хаскель - Монады 5 часов. Это нормально?

Alexander
14.09.2017
14:41:54
если мы сделали instance для Num, то очевидно, что надо писать:
newtype Int' = Int' Int deriving (Num)

Dmitry
14.09.2017
14:42:04
курс на степике нормально
только это не ютуб

Alexandr
14.09.2017
14:42:14
я новичек, точно могу ошибаться в названиях:) Я имел ввиду, что мы создаем instance для Int
instance Foo Int where bar ...
Но почему бы того же делать не для типов, а для тайпклассов

Alexander
14.09.2017
14:42:42
тут одновременно 4 вопроса и вечно в них путаница

ParkeT
14.09.2017
14:43:06

Alexander
14.09.2017
14:43:14
можно:
a. реализовать для всех типов с констрейном Num, но для других нельзя:
instance Num a => Foo a
можно сделать дефолтную реализацию для Num:
class Foo a where
default bar :: (Num a, Ord a) => ...
тогда если у типа есть Num, то достаточно будет написать: instance Foo A
делается инстанс класса для типа

Google

Alexander
14.09.2017
14:45:10
конечно никто наверное не запрещает сделать:
class Foo (a :: * -> Constraint) where

Alexandr
14.09.2017
14:45:21

Alexander
14.09.2017
14:45:23
и реализовывать классы для классов =)
/shrug
я не вижу ни кода ни ошибки компиляции, я ничего сказать не могу

Vasiliy
14.09.2017
14:47:01

Alexander
14.09.2017
14:47:17
{-# LANGUAGE DefaultSignatures #-}
class Foo a where
foo :: a -> Bool
default foo :: (Ord a, Num a) => a -> Bool
foo x = x > 5
instance Foo Int
эта часть точно работает
что там дальше происходило я не знаю

Alexandr
14.09.2017
14:50:08
Да, сори, сработало, видимо как-то криво сам написал. Просто идея была в том, чтобы не писать интанс для каждого типа, который принадлежит какому-то тайпклассу

Alexander
14.09.2017
14:53:19
не надо так
у если захочется написать свой инстанс для класса, у которого есть такой констрейнт, то у компилятора не будет причин предпочитать тот или иной

Alexandr
14.09.2017
15:00:00

Alexander
14.09.2017
15:00:34
ты можешь написать:
instance (Ord a, Num a) => Foo a where

Alexandr
14.09.2017
15:00:50

Alexander
14.09.2017
15:00:56
так?

Alexandr
14.09.2017
15:01:01
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE UndecidableInstances #-}
class Foo a where
foo :: a -> Bool
class Bar a where
bar :: a -> Bool
newtype Int' = Int' Int deriving (Eq, Ord, Num)
instance (Ord a, Num a) => Foo a where
foo n = n > 5
instance (Ord a, Num a) => Bar a where
bar n = n > 10

Alexander
14.09.2017
15:01:22
вот, это инстанс для всех типов а
т.е. любой вообще любой тип под него попадает
совсем любой

Google

Alexander
14.09.2017
15:01:52
после того как инстанс выбран компилятор смотрет в констрейнты
и или падает или выбирает
через overloading можно сначала делать конкретные потом остальные, но это так себе путь

Vasiliy
14.09.2017
15:02:40
overloading - имеется в виду overlaps и overlapping ?

Alexander
14.09.2017
15:02:49
да
отвлекаюсь

Alexandr
14.09.2017
15:04:49
просто не совсем понимаю чем это плохо
оно же так и работает

Alexander
14.09.2017
15:06:46
> если захочется написать свой инстанс для класса, у которого есть такой констрейнт, то у компилятора не будет причин предпочитать тот или иной

Alexandr
14.09.2017
15:08:34
ну я понял, короче это будет работать и будет вроде удобно, пока не перестанет :D

Vasiliy
14.09.2017
15:09:16
оно перестанет работать при появлении любого другого инстанса Foo
и предложит пошаманить прагмами OVERLAPS и OVERLAPPABLE
я не знаю, какие конкретно проблемы оно за собой тянет, но знающие люди говорят, что лучше с этой фигнёй не связываться

Alexandr
14.09.2017
15:11:40
понял, спасибо за разъяснение:)

Alexander
14.09.2017
15:12:24
ну OVERLAPS и OVERLAPPABLE сделало жизнь гораздо лучше
чем было до
но все равно есть шансы оказаться одновременно с двумя разными словарями

Alexandr
14.09.2017
15:13:26
Я кстати посмотрел доку ghc, там поиска нет, как можно найти раздел с прагмами?
или мб есть дока с нормальным поиском?

Kirill
14.09.2017
15:17:57

Google

Alexander
14.09.2017
15:21:36
@basov_ae https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/lang.html
аккуратный overlappable/overlapping норм

Index
14.09.2017
15:58:09
Но в случае конечного множества опций лучше closed type family и вспомогательный класс
Потому что тогда аккуратничать не придется

Vasiliy
14.09.2017
16:02:07
> лучше closed type family и вспомогательный класс
а есть конкретный пример?

Index
14.09.2017
16:25:27
См. RElem с вспомогательным параметром в vinyl
Где-то был еще классный gist от IcelandJack на этот счет

Vasiliy
14.09.2017
17:44:37
спасибо, погуглю

Alexander
14.09.2017
20:46:03
а можно по олеговски MPTC+FD
но суть там будет примерно та же

Alexandr
14.09.2017
21:35:13
Ребят, как можно написать map используя fold? Когда есть
data Tree a = Leaf | Node (Tree a) a (Tree a)
fold :: (a -> b -> b) -> b -> Tree a -> b
с фолдом с 3-мя аргументами все понятно, а вот что с двумя делать воообще понять не могу
map :: (a -> b) -> Tree a -> Tree b

Vladislav
14.09.2017
21:38:48
а fold в in-order обходит дерево, или как?
и нужно ли сохранять структуру оригинального дерева?

Alexandr
14.09.2017
21:42:44
в этом фолде постордер выходит, как сделать инордер не понял для функции с двумя параметрами. Сохранить порядок было бы логично, но как это сделать как раз и не понимаю

Vladislav
14.09.2017
21:45:45

Alexandr
14.09.2017
21:46:39
Да, я тоже думал об этом, но подумал, что может я чего-то не вижу
В книге задание такое