Aliester
обяснять устройство человека перед тем как допустить к хирургии
Алексей ayaye :)
Объясняют же
когда я начинал, о внутреннем устройстве компилятора ничего не знал. и это не мешало
кана
кана
Внутренности аппликативов скрыты
кана
У нас только интерфейс применения функций
Алексей ayaye :)
эм, уточню - я про второй курс на степике. там только и разговоров о внутреннем устройстве стандартной библиотеки )
Alexander
Aliester
я шучу
Alexander
Правильная аналогия была бы - объяснять устройство лазерного скальпеля и томографа на уровне физики процессов
Aliester
на самом деле это скорее патан на курсах первой помощи
kosc
Как там по канону правильно, бесточечной нотацией писать?
kosc
Расскажите бестпрактис по композиции функций в хаскеле плиз.
Ilya
если сам можешь прочитать на следующий днеь — то нормально
Алексей
Лучше через недельку
Алексей
Бест практис одна — не злоупотреблять
Ilya
Aleksei (astynax)
Aleksei (astynax)
Из живого есть CλaSH
Ilya
клэш знаю
Ilya
но хотелось посмотреть на честно встроенный язык, а не хакнутый ghc 🙂
Timofey
Вопросец такой: я для executables включил -Wmissing-import-lists, для библиотеки включать не стал. При этом ghc-mod в лице hie стал доблестно мне рапортовать этот варнинг для библиотечных модулей. Это так и должно быть ("варнинги спускаются вниз по транзитивности") или косяк hie?
Leonid 🦇
Евгений
Ну, мне не нравится, что в персистенте слишком руками
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
Спасибо, вплоне понятно, кстати.
Алексей
kosc
А по коду есть какие-нибудь замечания/предложения?
Ilya
ты точно правильную ссылку скинул?:) что там ревьюить, две строчки
Ilya
кидай весь проект
kosc
Так это и есть весь проект :)
Ilya
сильно:)
kosc
У меня пока даже такие маленькие куски кода на хаскеле через боль пишутся.
kosc
Когда будет легко - буду покрупнее что-то делать.
kosc
Линзы раскуривать, ещё сервант хочу потыкать.
kosc
Что бы более реальное что-то было.
Ilya
kosc
Ништяк, спасибо!
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
Cheese
Cheese
Ilya
спс
A64m
один из лучших хаскельных едсл-ей - это комбинаторные парсеры, но таким уже никого не удивишь, конечно
Ilya
хотя я имел в виду честно встроенный HDL
Ilya
но ivory все равно интересно, посмотрю
Leonid 🦇
A64m
ну, зависит от того какое соотношение того что один к одному, а что нет
eahqzsr
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