
Timofey
12.07.2018
09:02:25
Вопросец такой: я для executables включил -Wmissing-import-lists, для библиотеки включать не стал. При этом ghc-mod в лице hie стал доблестно мне рапортовать этот варнинг для библиотечных модулей. Это так и должно быть ("варнинги спускаются вниз по транзитивности") или косяк hie?

shadowjack
12.07.2018
09:30:14

Leonid
12.07.2018
10:48:21

Евгений
12.07.2018
10:49:03
Ну, мне не нравится, что в персистенте слишком руками

Google

Hot
12.07.2018
11:59:47
В общем, поревьюйте код плиз: https://hastebin.cuttlerat.ru/vibicevoyo.hs
Не хочу откровенный говнокод сразу на github лить.
И подскажите, что делает оператор (&&&) (этот кусок я на stackoverflow нашёл просто) ?

A64m
12.07.2018
12:02:25
(f &&& g) x = (f x, g x)

Vladimir
12.07.2018
12:02:31
то же, что и bimap в Bifunctor

A64m
12.07.2018
12:03:00
бимап это же ***

Vladimir
12.07.2018
12:03:40
э да, недосмотрел, извиняюсь

A64m
12.07.2018
12:04:26
вернее бимап более общий чем ***, конечно, это еще и +++ и т.д.

Hot
12.07.2018
12:06:45
Спасибо, вплоне понятно, кстати.

Pineapple
12.07.2018
12:07:44

Hot
12.07.2018
12:08:50
А по коду есть какие-нибудь замечания/предложения?

Ilya
12.07.2018
12:09:26
ты точно правильную ссылку скинул?:) что там ревьюить, две строчки
кидай весь проект

Google

Hot
12.07.2018
12:10:26
Так это и есть весь проект :)

Ilya
12.07.2018
12:10:47
сильно:)

Hot
12.07.2018
12:10:54
У меня пока даже такие маленькие куски кода на хаскеле через боль пишутся.
Когда будет легко - буду покрупнее что-то делать.
Линзы раскуривать, ещё сервант хочу потыкать.
Что бы более реальное что-то было.

Ilya
12.07.2018
12:11:38

Hot
12.07.2018
12:11:48
Ништяк, спасибо!

A64m
12.07.2018
12:17:41

Hot
12.07.2018
12:18:22
Ух ты, да, так прикольнее, спасибо.

Kirill
12.07.2018
12:23:41
hlint про скобки подсказал бы, думаю
mapM_ + компрехеншн смотрится странновато
яб тупо сделал forM_ list $ \(word, count) -> do ...
ну или без бакса в 8.6 :)

A64m
12.07.2018
12:27:15
да, или for_

Kirill
12.07.2018
12:28:50
ну да, но с M как-то чуть явней как по мне, для тупых

A64m
12.07.2018
12:29:26
с другой стороны это до AMP реликт

Kirill
12.07.2018
12:30:08
олдскул :)

A64m
12.07.2018
12:30:11
совсем не удивлюсь, если с такими штуками в среднеотдаленном будущем бороться начнут, так что лучше не привыкать

Kirill
12.07.2018
12:30:59
с буквой M бороться будут?

Google

A64m
12.07.2018
12:31:43
да, с M-функциями вполне могут
так что я подозреваю, что такой код не фьючепруф

Kirill
12.07.2018
12:32:20
"Весь мир насилья мы разрушим", ну ок
надеюсь в hlint по дефолту не скоро добавят

A64m
12.07.2018
12:33:58

Yuriy
12.07.2018
12:34:39

Ilya
12.07.2018
12:37:04
спс

A64m
12.07.2018
12:38:10
один из лучших хаскельных едсл-ей - это комбинаторные парсеры, но таким уже никого не удивишь, конечно

Ilya
12.07.2018
12:38:36
хотя я имел в виду честно встроенный HDL
но ivory все равно интересно, посмотрю

Leonid
12.07.2018
12:41:57

A64m
12.07.2018
12:43:27
ну, зависит от того какое соотношение того что один к одному, а что нет

shadowjack
12.07.2018
12:44:24

Hot
12.07.2018
12:44:49
А в чём принципиальное отличие-то?

Kirill
12.07.2018
12:47:20
s/map/fmap/ это просто повод запутать новичков
имхо

shadowjack
12.07.2018
12:47:47
fmap работает на любом функторе, а map только на листах

A64m
12.07.2018
12:48:07
так там уже комбинация с функциями над списками

Kirill
12.07.2018
12:48:26
код не полиморфый, куда там любые функторы?

A64m
12.07.2018
12:48:55
т.е. от более полиморфного кода никакого эффекта кроме ухудшения вывода типов и вероятности (очень невысокой правда) получить неправильный код при модификации

Google

Kirill
12.07.2018
12:49:21
и ухудшение читабельности
если работает тупой код, не стоит его переусложнять на пустом месте

Ilya
12.07.2018
12:50:51
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
@hotkosc поинт фри везде

A64m
12.07.2018
12:51:13
польза-то от мономорфного map в прелюдии конечно сомнительная, но раз уже есть - чего бы и не использовать

shadowjack
12.07.2018
12:53:53
Ну правый map он вообще над стрингом. Если переписывать на Text нужно будет менять.

Kirill
12.07.2018
12:56:35
и там ты оставишь fmap, а не заменишь на T.toLower?
и Text станет функтором

shadowjack
12.07.2018
13:01:37
Не, это я ерунду сказал

A64m
12.07.2018
13:20:15
считаем слова, используя смешной экстеншен, которым никто не пользуется
> t = "foo bar baz foo foo bar"
> [(the word, length word)
| word <- words t
, then group by word using groupWith
, then sortWith by Down (length word)]
[("foo",3),("bar",2),("baz",1)]

Admin
ERROR: S client not available

Mikhail
12.07.2018
13:26:05

shadowjack
12.07.2018
13:27:36
считаем слова, используя смешной экстеншен, которым никто не пользуется
> t = "foo bar baz foo foo bar"
> [(the word, length word)
| word <- words t
, then group by word using groupWith
, then sortWith by Down (length word)]
[("foo",3),("bar",2),("baz",1)]
А не будет ошибки если будут встречаться "foo" и "Foo"?

A64m
12.07.2018
13:29:35
а, ну тут понятно надо к одному регистру привести еще

Anatolii
12.07.2018
13:34:56
считаем слова, используя смешной экстеншен, которым никто не пользуется
> t = "foo bar baz foo foo bar"
> [(the word, length word)
| word <- words t
, then group by word using groupWith
, then sortWith by Down (length word)]
[("foo",3),("bar",2),("baz",1)]
а что за экстеншон?

A64m
12.07.2018
13:35:30
TransformListComp

Denis
12.07.2018
13:35:50

A64m
12.07.2018
13:40:11
если бы запрос был по списку рекордов, какая-никакая польза была бы лучше видна, так он конечно выглядит особенно вымученно

Anatolii
12.07.2018
13:41:06
Ну красиво ?

Hot
12.07.2018
13:42:25
А в GHCi как-то можно типы обозначать у создаваемых функций?

Google

Dmitry
12.07.2018
13:42:37
Мне вот этот подход понравился, когда хочется чего-то вроде ограниченнгого SQL для обработки таблиц в Haskell:
* http://www.timphilipwilliams.com/posts/2017-04-12-nested-datacubes.html
Я в одном проекте использовал, было довольно удобно (без этого вообще не получилось бы нормально сделать). Там надо просто кучу строчек по разным критериям аггрегировать несколько раз в разных извращениях. Правда, сначала потратил 3 дня, чтобы это осознать...

Hot
12.07.2018
13:42:39
Когда компилятор их сам вывести не может.

A64m
12.07.2018
13:43:56

Dmitry
12.07.2018
13:43:57

Hot
12.07.2018
13:44:28
А, точняк, спасибо.

A64m
12.07.2018
13:44:40
да, или
foo :: Int -> Int; foo x = x + 1
если в многострочный режим лень переключаться

M
12.07.2018
13:44:58
считаем слова, используя смешной экстеншен, которым никто не пользуется
> t = "foo bar baz foo foo bar"
> [(the word, length word)
| word <- words t
, then group by word using groupWith
, then sortWith by Down (length word)]
[("foo",3),("bar",2),("baz",1)]
красиво

A64m
12.07.2018
13:46:39
плохо, что сигнатура функции репл в многострочный режим не переключает, если автоматическая многострочность включена

Leonid
12.07.2018
13:47:58
т.е. тут, как мне кажется, лёгкий бойлерплейт который легко выкинуть будет лучше чем 30 минут компилящийся модуль

A64m
12.07.2018
13:50:01
чет работа по решению этой проблемы заглохла

Dmitry
12.07.2018
13:52:30

A64m
12.07.2018
13:53:43
оно того не стоит.

shadowjack
12.07.2018
13:53:59
Можно еще инлайн let f = map (+1) . filter (==1) :: [Int] -> [Int]

A64m
12.07.2018
13:54:08
вообще, пока история репла с многострочными кусками не работает от многострочности толку мало

Dmitry
12.07.2018
14:04:50
Я когда пилил поддержку REPL'а для Kotlin в JetBrains, то там надо было сделать поддержку многострочного ввода по дефолту и с этим были заморочки. Там даже есть клёвая фича, что когда листаешь вверх, то сразу вся функция показывается, а не по одной строке, как в многострочном вводе ghci... Правда, когда в языке надо ставить фигурные скобки явно для выделения блоков, то это сделать проще

A64m
12.07.2018
14:07:06
ну я про это и говорю. история должна для всего многострочного куска работать
у эмелей репл в многострочном режиме по умолчанию обычно
там многострочный блок завершается ; или ;;
первый вариант вполне и для хаскеля рабочий

Hot
12.07.2018
14:09:45
filter (\x -> all (\z -> z /= 0) [fromIntegral (mod (fromIntegral x) (fromIntegral y)) | y <- [2..(toInteger . fromIntegral . truncate . sqrt $ fromInteger x)]]) [toInteger . fromIntegral $ x | x <- [1..1000]]

A64m
12.07.2018
14:09:46
но истории нормальной и в эмелях нет

Hot
12.07.2018
14:09:54
Как думаете, этим можно джуна убить?