Anonymous
Ток у этого способа читаемость не самая лучшая
Cheese
min' x y = fmap getMin $ ((<>) `on` fmap Min) x y
Cheese
используется свойство инстанса полугруппы для Maybe
Антон
min' x y = fmap getMin $ ((<>) `on` fmap Min) x y
min' = (fmap getMin .) . ((<>) `on` fmap Min)
Cheese
min' = (fmap getMin .) . ((<>) `on` fmap Min)
о, у нас pointfree бот появился
Антон
о, у нас pointfree бот появился
Your text does not look like Haskell code
A64m
сто лет уж коерс есть, нет, все фмапы лепят
Cheese
так безопаснее
A64m
все равно же принято сигнатуры типов писать, ну так хоть пользовались бы этим для выведения кода
A64m
выводить типы не хотят, выводить код не хотят, хотят только страдать
Cheese
Вместо .from()/.into()? Умно
вот это точно не Хаскель
A64m
оказывается у эклипса и у вс код один "автор"
A64m
это что-то уровня фортран и фп, конечно
Антон
вот это точно не Хаскель
Конечно. Но это тоже весьма удобная вещь
Cheese
вот так менее страдательно? min' :: Ord a => Maybe a -> Maybe a -> Maybe a min' x y = coerce $ ((<>) `on` fmap Min) x y
A64m
min' :: forall a. Ord a => Maybe a -> Maybe a -> Maybe a min' = coerce ((<>) @(Maybe(Min a))) ЗИРО КОСТ АБСТРАКШОН
Vladislav
min' = coerce ((<>) @(Maybe(Min a))) а что здесь @ значит? типа on?
Cheese
чорт, я самый медленный тут
A64m
min' = coerce ((<>) @(Maybe(Min a))) а что здесь @ значит? типа on?
это применение параметра типа, как foo<T> foo @T
Евгений
А зачем ты форолл явно пишешь?
A64m
чтоб a потом использовать в типе
Евгений
А если ты его просто в типах заюзаешь, то использовать его нельзя будет?
A64m
> :{ | min' :: Ord a => Maybe a -> Maybe a -> Maybe a | min' = coerce $ (<>) @(Maybe(Min a)) | :} <interactive>:54:34: error: Not in scope: type variable `a'
Vladislav
это применение параметра типа, как foo<T> foo @T
не понятно. Где об этом почитать?
Антон
не понятно. Где об этом почитать?
https://ghc.haskell.org/trac/ghc/wiki/TypeApplication
A64m
не понятно. Где об этом почитать?
https://ghc.readthedocs.io/en/latest/glasgow_exts.html#visible-type-application
Vladislav
thanks!
Алексей
сто лет уж коерс есть, нет, все фмапы лепят
Фмапы можно лепить в бессознательном состоянии
A64m
а написать тип какой надо для подбора словарей и потом какой надо для использования нельзя что ли?
Алексей
Можно, но это надо говлову включить
A64m
ну тут вроде надо головы как минимум одинаково, чтоб придумать что надо моноид для Maybe (Min a) дальше уже не надо
Cheese
@qnikst к тебе комментарий https://www.youtube.com/watch?v=K4gDf1jCJEM&lc=Ugwd_kJRREezGu-P7ZZ4AaABAg
Anonymous
Фмапы можно лепить в бессознательном состоянии
Обколются своими стероидами и давай лепить фмапы в бессознательном состоянии
Andrey
функторами же
Anonymous
Lev
“Haskell is very simple. Everything is composed of Functads which are themselves a Tormund of Gurmoids, usually defined over the Devons. All you have to do is stick one Devon inside a Tormund and it yields Reverse Functads (Actually Functoids) you use to generate Unbound Gurmoids.” (c) @niftierideology
Dmitry
И ведь правда, я именно так и программирую.
IC
как сделать функцию (или класс) вида Not (Show a) => a -> ()?
Aleksei (astynax)
Т.е. ты хочешь расконстреинт?
Aleksei (astynax)
"освобождение"
Aleksei (astynax)
или "попущение"
Alexander
гарантию отсутствия инстанса
Alexander
я знаю как для конкретных типов такое сделать
Alexander
и.е. придется явно перечислить
A64m
никак без потенциально очень больших проблем
Алексей
Как?
Alexander
через closed type family TypeError
Alexander
у серокелей в predule их было что-то такое чтобы Exception запрещать
Alexander
или в гайдах IOHK
Ilya
C QuantifiedConstraints и если ввести контрейнт False, для которого нельзя сделать инстанс, наверное можно будет написать традиционное (Show a => False) => a -> ()
Ilya
только часть a -> () как-то не особо осмысленно выглядит, в чистом языке это изоморфно ()
кана
жаль хаскель не чистый и там это имеет смысл
IC
это не важно
IC
а с тайпклассами такое прокатит?
IC
instance (Show a => False, Show b, Show c => False) => Foo a b c where foo :: b -> String
IC
ну и чтобы гхц сам выбрал подходящий
Ilya
я хз, я QuantifiedConstraints еще не пробовал
Alexander
я думаю не взлетит
Alexander
но я не пробовал
Ilya
Да и про добавление специального констрейнта False я ничего не слышал, так что сорри, если дал надежду, мой комент выше был в большей степени умозрительным
IC
https://hackage.haskell.org/package/constraints-0.10.1/docs/Data-Constraint.html хм...
Ilya
а, ок, Bottom уже есть
IC
но будет ли им пользоваться солвер? просто кинуть typeerror не интересно
Alexander
не будет это имхо нормально работать
Alexander
хотя с QuantifiedConstraints шансы увеличиваются, надо б его помучать
IC
есть класс с тремя аргументами и к нему есть ровно три инстанса - выбирай первый аргумент, второй, третий.
IC
хочется чтобы оно без аннотаций само выбирало какой из них подходит. потому что с аннотациями проще просто три функции написать.
Alexander
можно попробовать, но мне кажется что игра свечь не стоит
Alexander
а какой алгоритм выбора?
A64m
вообще-то предполагается, что написание кода, поведение которого меняется от добавления инстанса в хаскеле делается только с помощью багов и дыр, которые компрометируют работоспособность тайпклассов
IC
Show для примера. на самом деле там скорее instance (???) => Foo [a] b c where — "найди список"
Alexander
а если Show есть у первого и второго?
IC
а если Show есть у первого и второго?
тогда можно смело тайперрор кидать
IC
пользовательский
Alexander
так, а откуда список появился?
кана
Да и про добавление специального констрейнта False я ничего не слышал, так что сорри, если дал надежду, мой комент выше был в большей степени умозрительным
ну такой сделать можно, True ~ False, просто хаскель не выведет, что это пустой констрейт, и что Void => Void положительный он тоже не выведет, ведь его нужно будет сконструировать