
Vladimir
12.12.2016
21:16:45
Гениально
х-ль любишь? давай

That Guy
13.12.2016
20:10:07
Товарищи, подскажите аналог оператора ., действующий в обратную сторону (то есть если (f . g) x == f(g(x)), то (f +++ g) x == g(f(x))).
Короче, как это написать средствами стандартной библиотеки?
f +++ g = g . f
main = do
n <- readLn
arr <- getLine >>= (words +++ map read +++ return)
putStrLn "hi"

Google

eugene
13.12.2016
20:14:32
f >>> g?

That Guy
13.12.2016
20:15:06
c.hs:13:27: error:
• Variable not in scope:
(>>>) :: (String -> [String]) -> ([String] -> [b0]) -> String -> a1
• Perhaps you meant one of these:
‘>>=’ (imported from Prelude), ‘>>’ (imported from Prelude)

eugene
13.12.2016
20:15:17
Control.Arrow

That Guy
13.12.2016
20:16:47
О, спасибо. Вот такое скомпилилось:
import Control.Monad (liftM)
import Control.Arrow ((>>>))
main = do
n <- readLn :: IO Int
a <- liftM (words >>> map read) getLine :: IO [Int]
putStrLn "hi"

eugene
13.12.2016
20:17:08
??

That Guy
14.12.2016
11:01:15
Почему здесь
import Control.Monad.ST (ST, runST)
import Data.Array.ST (STArray, newArray, getElems)
existsEmpty n = runST $ do
arr <- newArray (1, n) [] :: ST s (STArray s Int [Integer])
-- какой-то длинный код
return $ any mempty $ (getElems arr :: [[Integer]])
компилятор выдаёт ошибку
Couldn't match type ‘[Integer]’ with ‘Integer’
Expected type: [[Integer]]
Actual type: [[[Integer]]]
• In the second argument of ‘($)’, namely
‘(getElems arr :: [[Integer]])’
...
? Казалось бы, я инициализирую массив списков, и затем превращаю его в список списков. Откуда [[[Integer]]]?

Alexander
14.12.2016
12:15:32
(getElems incoming :: [[Integer]])
ты хочешь чтобы мы угадали что не так в коде, который ты не показал?
incomming не присуствует в процитированном участке кода
any mempty это тоже как-то сильн

That Guy
14.12.2016
12:17:06

Alexander
14.12.2016
12:17:12
any :: Foldable t => (a -> Bool) -> t a -> Bool

Google

Alexander
14.12.2016
12:17:49
отсюда mempty :: (a -> Bool)
instance Monoid b => Monoid (a -> b)
getElems :: (MArray a e m, Ix i) => a i e -> m [e]
мне жалко компилятор ;)
any empty <$> getElems arr
наверное это имелось ввиду:?

That Guy
14.12.2016
12:21:04
any empty <$> getElems arr
:t empty
<interactive>:1:1: error:
• Variable not in scope: empty
• Perhaps you meant ‘mempty’ (imported from Prelude)

Alexander
14.12.2016
12:21:24
:m +Data.List
я так понимаю ты хочешь увидеть, что какой-то из списков пустой

That Guy
14.12.2016
12:22:01
да

Alexander
14.12.2016
12:22:05
но mempty этого не делает, это 0 для моноида
хотя название и похоже

That Guy
14.12.2016
12:22:19
значение, а не предикат
ясно

Alexander
14.12.2016
12:23:11
там вообще все плохо с типами

That Guy
14.12.2016
12:23:25
:t mempty
mempty :: Monoid a => a

Alexander
14.12.2016
12:23:35
и?

That Guy
14.12.2016
12:23:50
Вот это значение :)

Google

Alexander
14.12.2016
12:24:26
> но mempty этого не делает, это 0 для моноида
про чт я и говорил
но т.к. тип any :: (a -> Bool) -> t a -> Bool => этот конкретный mempty должен быть (a -> Bool)
в общем не важно
напиши правильно:
any empty <$> getElems arr

That Guy
14.12.2016
12:26:33
existsEmpty :: Int -> [Int] -> Bool
existsEmpty n g = runST $ do
incoming <- newArray (1, n) [] :: ST s (STArray s Int [Int])
gg <- newSTRef g
for_ [1..n] $ \idx -> do
h:t <- readSTRef gg
current <- readArray incoming h
writeArray incoming h (idx:current)
writeSTRef gg t
elems <- getElems incoming
return $ any null elems
Такое работает

Alexander
14.12.2016
12:27:05
а точно

That Guy
14.12.2016
12:27:15
existsEmpty :: Int -> [Int] -> Bool
existsEmpty n g = runST $ do
incoming <- newArray (1, n) [] :: ST s (STArray s Int [Int])
gg <- newSTRef g
for_ [1..n] $ \idx -> do
h:t <- readSTRef gg
current <- readArray incoming h
writeArray incoming h (idx:current)
writeSTRef gg t
return $ any null <$> getElems incoming
такое не проходит тайпчек с ошибкой:
• Couldn't match type ‘f0 Bool’ with ‘Bool’
Expected type: ST s Bool
Actual type: ST s (f0 Bool)
• In a stmt of a 'do' block:
return $ any null <$> getElems incoming

Alexander
14.12.2016
12:27:17
спать покра мне
any null <$> getElems
нафига временные байндинги вводить
почему return то?

Alexander
14.12.2016
12:28:08
return :: a -> m a
any null <$> getElems incomming :: ST s Bool
если сделать return $ .. то будет ST s (ST s Bool)

Quet
14.12.2016
12:30:19
как зачем? потому что из функции нужно вернуться… вот и return
очень удачное имя конечно в свое время выбрали они для монады (

Anatolii
14.12.2016
12:31:18
мне кажется если разбираться чуточку более основательно
то проблем с return не возникает

That Guy
14.12.2016
12:31:36

Google

Anatolii
14.12.2016
12:31:48
просто обычно хочется сесть и за вечерок газануть сервис
без книжек и прочего

Alexander
14.12.2016
12:32:17
<$> там не просто так

Anatolii
14.12.2016
12:32:28
<$> ты поднял это все в монаду

That Guy
14.12.2016
12:32:29
Да, я понял.
return там изначально был, потому что у меня был лишний байндинг

Alexander
14.12.2016
12:32:59
угу
кстати из-за этого ошибка про [[[]]] была

Admin
ERROR: S client not available

Alexander
14.12.2016
12:33:40
у ghc получилось вывести что оно сойдётся будет соотв тип у массива
кстати, есть ли причина по которой используется array, а не vector?

That Guy
14.12.2016
12:34:21

Alexander
14.12.2016
12:34:24
ну кроме того, что это задание в универе, а в системе проверки только ghc и либы идущие с ним
тогда советую брать vector

That Guy
14.12.2016
12:34:50
Это не задание в универе, это http://codeforces.com/contest/742/problem/C
Но замечание про систему проверки по-прежнему актуально

Timothy
14.12.2016
13:54:44
hah, еще не было ссылки http://simonmar.github.io/posts/2016-12-08-Haskell-in-the-datacentre.html ?

That Guy
14.12.2016
14:19:23

Alexander
14.12.2016
14:20:03
import Control.Applicative
import Prelude
и будет на всех ghc без warning-ов работать

Google

Alexander
14.12.2016
14:20:26
на многих системах ставят популярные либы

That Guy
14.12.2016
14:21:35
А как перекрыть импортированный из Prelude символ?
Нашёл. import hiding
Товарищи, не мог бы кто-то мне сделать code review?
http://codeforces.com/contest/742/submission/22950482

Alexander
14.12.2016
14:26:51
а какие символы надо было спрятать?

That Guy
14.12.2016
14:27:36
<$> из Prelude, чтобы локально компилировалось

Alexander
14.12.2016
14:27:52
оно реэкспортирует же
import Control.Applicative
import Prelude
вот именно так будет работать без ворнингов
т.е. из Applicative не явно, а импорт Prelude после
f <$> a = do
t <- a
return $ f t
нинада так, нужно или нормальный или fmap

That Guy
14.12.2016
14:29:19
Почему два импорта на один символ?

Alexander
14.12.2016
14:29:45
чтобы не было warning-ов на версиях д AMP и после
просто забавный хак, использующий правила того, как работают warning-и на redundant import
import Control.Applicative <- благодаря этому работает на <7.10
import Prelude <- благодаря этому не генерируется warning на >=7.10
whileM p f = do { x <- p; when x (f » whileM p f) }
т.е. там как-то слишком много строчек

That Guy
14.12.2016
14:32:36
http://codeforces.com/contest/742/submission/22950581
Теперь у меня локально выдаётся warning, что Module ‘Control.Monad.ST.Safe’ is deprecated, но иначе это не компилируется на сервере с ошибкой
Control.Monad.ST: Can't be safely imported!
The module itself isn't safe.

Alexander
14.12.2016
14:33:04
посмотри документацию, что использовать взамен
я на память не скажу, никогда его не импортирова

That Guy
14.12.2016
14:33:33
GHC 8.0.1 локально при компиляции с Safe:
Module ‘Control.Monad.ST.Safe’ is deprecated:
Safe is now the default, please use Control.Monad.ST instead
GHC 7.8.3 на сервере без Safe:
program.hs:6:1:
Control.Monad.ST: Can't be safely imported!
The module itself isn't safe.
program.hs:7:1:
Data.Array.ST: Can't be safely imported!
The module itself isn't safe.

Alexander
14.12.2016
14:34:17
что мешает последовать совету?