Cheese
http://hackage.haskell.org/package/motor
выглядит как часть решения, спасибо
Алексей ayaye :)
как?
ну как, на Java написать
Алексей ayaye :)
Алексей ayaye :)
по аналогии с имеющимися
Cheese
ну, вариант
Dmitry
ANTLR не подходит?
Dmitry
Биндинги для генерации на Haskell тоже есть
Dmitry
@cblp_su ^
Алексей ayaye :)
Биндинги для генерации на Haskell тоже есть
я предложил уже. он разве умеет хаскель генерировать?
Dmitry
Действительно, не умеет
Dmitry
https://en.wikipedia.org/wiki/Comparison_of_parser_generators
Dmitry
Там какое-то GDK есть
Dmitry
Output languages: C, Lex, Haskell, HTML, Java, Object Pascal, Yacc
Алексей ayaye :)
я нашел только такую штуку, но похоже, это наоборот, чтобв из сгенерированного парсера на С вызывать код на хаскеле. Вообще не понимаю, зачем :)
Алексей ayaye :)
http://hackage.haskell.org/package/antlrc
Dmitry
В узлах обработку писать. Мне б такое лет пять назад пригодилось, тогда на Java обработку делал
Maxim
@cblp_su вы тоже пишете на qtah? :) Копаюсь в их репозитории и вдруг вижу знакомое имя в коммитах
Cheese
Cheese
но ничего лучше всё равно не могу посоветовать, при условии опыта в Qt
Maxim
Ну мы сейчас на нем ведём проект, я вот один пр туда уже протолкнул
Cheese
там много тупого кода приходится дописывать в библиотеку, очень долго компилируется
Cheese
и ещё указатели нулябельные
Cheese
жди NPE на каждом шагу
Cheese
впрочем, не более, чем в C++
Ilya
https://downloads.haskell.org/~ghc/master/users-guide/glasgow_exts.html#extension-GeneralizedNewtypeDeriving ого вот это фича в 8.6.1
Cheese
Глазго же
Vladislav
GND вроде давно уже, в 8.6 добавили DerivingVia
Vladislav
Все равно ссылка не на то, z это American spelling
Cheese
зачем там вообще американские версии?
Vladislav
https://downloads.haskell.org/~ghc/master/users-guide/glasgow_exts.html#extension-GeneralisedNewtypeDeriving
Vladislav
Так-то
Vladislav
зачем там вообще американские версии?
Я за интернационализацию, хочу {-# ЯЗЫК ОбобщенныйВыводДляНовТипов #-}
Cheese
не вывод, а производ
Vladislav
Хорошо
Cheese
вывод производных
Cheese
блин, всё равно по-русски коряво выходит
Ilya
как переписать такую вот функцию, чтобы было красиво? min' (Just x) (Just y) = Just (min x y) min' (Just x) Nothing = Just x min' Nothing (Just y) = Just y min' Nothing Nothing = Nothing
Vladislav
min' mX mY = min <$> mX <*> mY может?
Антон
min' mX mY = min <$> mX <*> mY может?
Не то, вернёт Nothing если хотя бы один Nothing
Ilya
min' mX mY = min <$> mX <*> mY может?
не сработает в 2 и 3 кейсах
Vladislav
аа, там не совсем то min' (Just x) Nothing = Just x min' Nothing (Just y) = Just y ну да, min' mX mY = min <$> mX <*> mY здесь Nothing дает.
Ilya
интересно, что для аналогичного max' оказывается верным, что max' = max, благодаря instance Ord a => Ord (Maybe a) λ> max (Just 1) (Just 2) Just 2 λ> max (Just 1) Nothing Just 1 λ> max Nothing Nothing Nothing
Алексей
Замениь последние три кейса на min' mx my = mx <|> my
Ilya
жаль, что они из двух возможных инстансов выбрали не тот, который нужен мне :)
Ilya
потому что Nothing меньше Just a.
потому что они так решили
Ilya
за этим нет ничего
Ilya
могли бы сделать, что Nothing больше (любого) Just a, разницы между двумя инстансами нет
Ilya
Замениь последние три кейса на min' mx my = mx <|> my
годится, но тогда надо целиком на комбинаторах, чтобы единый стиль
Ilya
min' mx my = liftA2 min mx my <|> mx <|> my
Ilya
вот так получилось =)
саша
min' mx my = liftA2 min mx my <|> mx <|> my
ну так понятнее стало и читается проще (нет)
A64m
да
Ilya
ну так понятнее стало и читается проще (нет)
извините, уважаемый сертифицированный хачкель специалист, что вам непонятно
саша
ну вообще с моей стороны оценивать читаемость этого кода конечно тупо, да
Алексей
min' :: Ord a => Maybe a -> Maybe a -> Maybe a min' x y = fmap getMin (fmap Min x <> fmap Min y)
Алексей
Min из Data.Semigroup
Ilya
min' :: Ord a => Maybe a -> Maybe a -> Maybe a min' x y = fmap getMin (fmap Min x <> fmap Min y)
хорошо! и будет работать для произвольного числа аргументов
Ilya
instance Semigroup a => Semigroup (Maybe a) where Nothing <> b = b a <> Nothing = a Just a <> Just b = Just (a <> b) полезный инстанс однако
A64m
min' :: forall a. Ord a => Maybe a -> Maybe a -> Maybe a min' = coerce ((<>) @(Maybe(Min a))) ЗИРО КОСТ АБСТРАКШОН
A64m
ну ладно, не хотите как в яве типы указывать, можно писать до посинения тогда: min' :: Ord a => Maybe a -> Maybe a -> Maybe a min' = coerce ((<>) :: Ord a => Maybe (Min a) -> Maybe (Min a) -> Maybe (Min a))
A64m
нет конечно, в плюсах нету параметрического полиморфизма
Антон
A64m
в hie / vs-code появился кейс-сплит обычно такая фича появляется в хаскельном ленгвидж-костыле перед тем как единственный мейнтейнер его забросит
Ilya
а можно для вимеров про кейс-сплит? что это
A64m
(но, если без шуток, уже есть ветка с костылением hie для 8.6 т.е. впервые ленгвидж-костыль может появиться не через месяцы после релиза нового гхц а почти сразу)
A64m
а можно для вимеров про кейс-сплит? что это
h :: [a] -> a h xs = undefined БАБАХ! h :: [a] -> a h [] = undefined h (xs:xss) = undefined
Ilya
h :: [a] -> a h xs = undefined БАБАХ! h :: [a] -> a h [] = undefined h (xs:xss) = undefined
так вот зачем нужны АТД, чтоб за тебя код иде писало
Ilya
крутая штука конечно
Anonymous
Насчёт min для maybe Если прописать что-то типа (-) Nothing = Nothing, то min' a b = -(max (-a) (-b)) Или я не прав?
Ilya
через fmap протащить (-)
Ignat
но это +ограничение на тип