Aleksei (astynax)
Скажем у меня есть некий класс FromTo { from, to }. А ещё есть class FromTo t => Encoder t where { encode = from }. Получить FromTo из Encoder с помощью только лишь encode я не смогу
Aleksei (astynax)
Получается, что у меня "беззаконный класс" и так делать нельзя?
Aleksei (astynax)
Где про это чётко написано?
Cheese
Cheese
Aleksei (astynax)
Констреинты, это же не сабклассинг какой-нить. Где нужно соблюдать принцип подстановки Лисков
Aleksei (astynax)
При сабклассинге я бы ещё понял такое требование - потомок должен уметь всё то, что умеет предок, и мочь его заменить в любом месте
Alexander
@astynax это значит что требование From скорее всего ненужное
Alexander
как Ord для Num
Aleksei (astynax)
Хмм. Т.е. правильнее в default методах констреинты иметь для такого случая?
Aleksei (astynax)
Это логично, если подумать
Алексей
Нет, когда мы можем выразить методы класса родителя через методы класса наследника это такой важный частный случай. fmap через методы монады не выражается если мы её определяем через return & join
Алексей
Ну или совсем крайний случай, клас не вводящий методов: class Monoid m ⇒ CommutativeMonoid m
Alexander
уговорили, наверное
Anonymous
@Polya_KV будет жить. Поприветствуем!
parket
Можем ли мы определить аппликацию для своего типа?
parket
Про это знаю <*>
Alexander
что значит аппликацию?
parket
myTypeValue arg
Alexander
что это значит?
Alexander
ты хочешь имя MyType применить к нему Foo и что-то получить?
Alexander
напиши типы вещей и получишь ответ
Alexander
если у тебя myTypeValue :: MyType, а arg :: B, то myTypeValue a - не типизируется
Alexander
чтобы применить B к чему-то у тебя должен быть тип B -> ...
parket
Ну, окей. Допустим
data F a b c = F ( a -> b -> c )
parket
fValue :: F Int Int Int
Alexander
что такое FValue?
parket
fValue = F (+)
Alexander
ну
Alexander
ты можешь сказать (\(F f) -> f 4) :: Int -> Int
parket
Могу, но я хочу так:
fValue 1 2 :: Int
Anonymous
data F a b c = F { applyF :: a -> b -> c }
fValue :: F Int Int Int
...
result = applyF fValue 1 2
^ где-то видел такую идиому
Alexander
Alexander
добавить деструктор
Alexander
вон как Yx написал
Alexander
applyF :: F a b c -> (a -> b -> c)
Alexander
как может быть прикольной штука у которой не сходятся типы?
Yura
не налазят!
Alexander
Александр, ты что такой токсичный последнее время?
Anonymous
в с++ такое есть вроде бы
Alexander
ты хочешь написать (fValue :: F Int Int Int) (1::Int) и получить выражение типа Int -> Int ?
Alexander
как?
parket
Да, у меня плохой пример выше. data F a b = F ( a -> b )
Alexander
Alexander
Грубоват. Люди экспериментируют, это нормально
Alexander
а какая разница, для того, чтобы применить агрумент к чему-то у тебя должен быть тип a -> ...
Alexander
а не F``
Alexander
устал и пора в отпуск
Big Bux Chungus
ты можешь определить новый оператор, чтобы fValue $$ 1 2 :: Int работало например
parket
parket
Короче, ребята, сорян, я спать
Big Bux Chungus
а без него никак я думаю
Alexander
@graninas вот смотри, какими словами я должен предложить человеку написать типы что он хочет, а не повторять А БЕЗ ЭТОГО
parket
type F a b = a -> b
Alexander
Alexander
так можешь, но F это у тебя синоним для обычной функции
Alexander
(+1) :: F Int Int — (Int -> Int)
Alexander
для того, чтобы применить аргументы к структуре, нужно структуру превратить в функцию и применить
Alexander
возможно просто распаковать
Alexander
например:
data F a = F {unF :: a -> a}
f = F (+1)
unF f 0
contramap (+1) f
Alexander
хотя последнее так просто не взлетит
Alexander
отлично грохнул ~/.cabal и ~/.ghc и стек сломался
Alexander
кусок софта :/
A64m
перегрузку пробела все никак не сделают
Alexander
вообще адище будет
Yura
:D
Alexander
ещё скобки перегрузить
Ilya
лисп получится сделать?
Alexander
так если обновлять STACK_ROOT то норм
Alexander
только деструктор это функция и он с маленькой буковы
Alexander
деструкторы вообще злое-зло
Alexander
но это не точно
Yura
это про С++ сейчас было?
Alexander
про haskell
Alexander
я не знаю C++
Yura
*Sarcasm*
Yura
почему зло то?