Aliester
обяснять устройство человека перед тем как допустить к хирургии
Алексей ayaye :)
Объясняют же
когда я начинал, о внутреннем устройстве компилятора ничего не знал. и это не мешало
кана
Внутренности аппликативов скрыты
кана
У нас только интерфейс применения функций
Алексей ayaye :)
эм, уточню - я про второй курс на степике. там только и разговоров о внутреннем устройстве стандартной библиотеки )
Aliester
я шучу
Alexander
Правильная аналогия была бы - объяснять устройство лазерного скальпеля и томографа на уровне физики процессов
Aliester
на самом деле это скорее патан на курсах первой помощи
kosc
Как там по канону правильно, бесточечной нотацией писать?
kosc
Расскажите бестпрактис по композиции функций в хаскеле плиз.
Ilya
если сам можешь прочитать на следующий днеь — то нормально
Алексей
Лучше через недельку
Алексей
Бест практис одна — не злоупотреблять
Aleksei (astynax)
HHDL, похоже, заброшен
Зато от Зефирова :)
Aleksei (astynax)
Из живого есть CλaSH
Ilya
клэш знаю
Ilya
но хотелось посмотреть на честно встроенный язык, а не хакнутый ghc 🙂
Timofey
Вопросец такой: я для executables включил -Wmissing-import-lists, для библиотеки включать не стал. При этом ghc-mod в лице hie стал доблестно мне рапортовать этот варнинг для библиотечных модулей. Это так и должно быть ("варнинги спускаются вниз по транзитивности") или косяк hie?
eahqzsr
Как там по канону правильно, бесточечной нотацией писать?
Ну если читабельно, то point free. Если нет, то явно. Сравни flip3 f a b c = f c b a и flip3 = flip. (flip.). flip
Евгений
Ну, мне не нравится, что в персистенте слишком руками
kosc
В общем, поревьюйте код плиз: https://hastebin.cuttlerat.ru/vibicevoyo.hs
kosc
Не хочу откровенный говнокод сразу на github лить.
kosc
И подскажите, что делает оператор (&&&) (этот кусок я на stackoverflow нашёл просто) ?
A64m
(f &&& g) x = (f x, g x)
Vladimir
то же, что и bimap в Bifunctor
A64m
бимап это же ***
Vladimir
э да, недосмотрел, извиняюсь
A64m
вернее бимап более общий чем ***, конечно, это еще и +++ и т.д.
kosc
Спасибо, вплоне понятно, кстати.
Алексей
я руками таплы в рекорды перековыриваю с postgresql-simple (postgresql-query)
Наверное можно автоматизировать с fixed-vector-hetero
kosc
А по коду есть какие-нибудь замечания/предложения?
Ilya
ты точно правильную ссылку скинул?:) что там ревьюить, две строчки
Ilya
кидай весь проект
kosc
Так это и есть весь проект :)
Ilya
сильно:)
kosc
У меня пока даже такие маленькие куски кода на хаскеле через боль пишутся.
kosc
Когда будет легко - буду покрупнее что-то делать.
kosc
Линзы раскуривать, ещё сервант хочу потыкать.
kosc
Что бы более реальное что-то было.
kosc
Ништяк, спасибо!
A64m
В общем, поревьюйте код плиз: https://hastebin.cuttlerat.ru/vibicevoyo.hs
вместо filepath <- fmap head getArgs (filepath:_) <- getArgs лучше ошибка будет если что вокруг show count скобки не нужны
kosc
Ух ты, да, так прикольнее, спасибо.
Kirill
hlint про скобки подсказал бы, думаю
Kirill
mapM_ + компрехеншн смотрится странновато
Kirill
яб тупо сделал forM_ list $ \(word, count) -> do ...
Kirill
ну или без бакса в 8.6 :)
A64m
да, или for_
Kirill
ну да, но с M как-то чуть явней как по мне, для тупых
A64m
с другой стороны это до AMP реликт
Kirill
олдскул :)
A64m
совсем не удивлюсь, если с такими штуками в среднеотдаленном будущем бороться начнут, так что лучше не привыкать
Kirill
с буквой M бороться будут?
A64m
да, с M-функциями вполне могут
A64m
так что я подозреваю, что такой код не фьючепруф
Kirill
"Весь мир насилья мы разрушим", ну ок надеюсь в hlint по дефолту не скоро добавят
A64m
я руками таплы в рекорды перековыриваю с postgresql-simple (postgresql-query)
по идее линзы должны генерировать iso между рекордом и соотв. туплом
Ilya
спс
A64m
один из лучших хаскельных едсл-ей - это комбинаторные парсеры, но таким уже никого не удивишь, конечно
Ilya
хотя я имел в виду честно встроенный HDL
Ilya
но ivory все равно интересно, посмотрю
Leonid 🦇
по идее линзы должны генерировать iso между рекордом и соотв. туплом
там не один к одному. всякие Binary ByteString и прочая чухня
A64m
ну, зависит от того какое соотношение того что один к одному, а что нет
eahqzsr
В общем, поревьюйте код плиз: https://hastebin.cuttlerat.ru/vibicevoyo.hs
Мне кажется тип main лучше явно написать. И fmap вместо map
kosc
А в чём принципиальное отличие-то?
Kirill
s/map/fmap/ это просто повод запутать новичков
Kirill
имхо
eahqzsr
fmap работает на любом функторе, а map только на листах
A64m
так там уже комбинация с функциями над списками
Kirill
код не полиморфый, куда там любые функторы?
A64m
т.е. от более полиморфного кода никакого эффекта кроме ухудшения вывода типов и вероятности (очень невысокой правда) получить неправильный код при модификации
Kirill
и ухудшение читабельности
Kirill
если работает тупой код, не стоит его переусложнять на пустом месте
Ilya
import Data.List (sort, group) import Data.Char (toLower) import Control.Arrow ((&&&)) import System.Environment (getArgs) import Control.Lens import Text.Printf wordCount :: String -> [(String, Int)] wordCount = map (head &&& length) . group . sort . words . map toLower format :: [(String, Int)] -> [String] format = map $ uncurry $ printf "%s %d" main = getArgs <&> head >>= readFile <&> wordCount <&> format >>= mapM putStrLn