Misha
это не особо релевантно, потому что haskell часто упоминают просто в тексте вакансии, в то время как собственно работа не обязательно с ним связана
Misha
да и скалу тоже
Vladimir
типа "вам тут не scala какая-то и уж точно не haskell"
Vladimir
ЖВ
Vladimir
А зачем stack solver добавляет какие-то глобальные констрейнты на версии
Vladimir
сам
Vladimir
в файл cabal.config
Vladimir
а, все, сообразил
Misha
х-ль любишь? давай
Vladimir
Гениально
Vladimir
х-ль любишь? давай
Dmitry
Товарищи, подскажите аналог оператора ., действующий в обратную сторону (то есть если (f . g) x == f(g(x)), то (f +++ g) x == g(f(x))).
Dmitry
Короче, как это написать средствами стандартной библиотеки?
f +++ g = g . f
main = do
n <- readLn
arr <- getLine >>= (words +++ map read +++ return)
putStrLn "hi"
Anonymous
f >>> g?
Dmitry
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)
Anonymous
Control.Arrow
Dmitry
О, спасибо. Вот такое скомпилилось:
import Control.Monad (liftM)
import Control.Arrow ((>>>))
main = do
n <- readLn :: IO Int
a <- liftM (words >>> map read) getLine :: IO [Int]
putStrLn "hi"
Anonymous
👍🏻
Dmitry
Почему здесь
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
(getElems incoming :: [[Integer]])
Alexander
ты хочешь чтобы мы угадали что не так в коде, который ты не показал?
Alexander
incomming не присуствует в процитированном участке кода
Alexander
Alexander
any mempty это тоже как-то сильн
Dmitry
Alexander
any :: Foldable t => (a -> Bool) -> t a -> Bool
Alexander
отсюда mempty :: (a -> Bool)
Alexander
instance Monoid b => Monoid (a -> b)
Alexander
getElems :: (MArray a e m, Ix i) => a i e -> m [e]
Alexander
мне жалко компилятор ;)
Alexander
any empty <$> getElems arr
Alexander
наверное это имелось ввиду:?
Alexander
Dmitry
any empty <$> getElems arr
:t empty
<interactive>:1:1: error:
• Variable not in scope: empty
• Perhaps you meant ‘mempty’ (imported from Prelude)
Alexander
:m +Data.List
Alexander
я так понимаю ты хочешь увидеть, что какой-то из списков пустой
Dmitry
да
Alexander
но mempty этого не делает, это 0 для моноида
Alexander
хотя название и похоже
Dmitry
значение, а не предикат
Dmitry
ясно
Dmitry
Alexander
там вообще все плохо с типами
Dmitry
:t mempty
mempty :: Monoid a => a
Alexander
и?
Dmitry
Вот это значение :)
Alexander
> но mempty этого не делает, это 0 для моноида
Alexander
про чт я и говорил
Alexander
но т.к. тип any :: (a -> Bool) -> t a -> Bool => этот конкретный mempty должен быть (a -> Bool)
Alexander
в общем не важно
Alexander
напиши правильно:
any empty <$> getElems arr
Dmitry
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
а точно
Dmitry
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
спать покра мне
Alexander
any null <$> getElems
Alexander
нафига временные байндинги вводить
Alexander
почему return то?
Alexander
return :: a -> m a
Alexander
any null <$> getElems incomming :: ST s Bool
Alexander
если сделать return $ .. то будет ST s (ST s Bool)
Quet
как зачем? потому что из функции нужно вернуться… вот и return
Quet
очень удачное имя конечно в свое время выбрали они для монады (
Anatolii
мне кажется если разбираться чуточку более основательно
Anatolii
то проблем с return не возникает
Anatolii
просто обычно хочется сесть и за вечерок газануть сервис
Anatolii
без книжек и прочего
Alexander
<$> там не просто так
Anatolii
<$> ты поднял это все в монаду
Dmitry
Да, я понял.
Dmitry
return там изначально был, потому что у меня был лишний байндинг
Alexander
угу
Alexander
кстати из-за этого ошибка про [[[]]] была
Alexander
у ghc получилось вывести что оно сойдётся будет соотв тип у массива
Alexander
кстати, есть ли причина по которой используется array, а не vector?
Dmitry
Alexander
ну кроме того, что это задание в универе, а в системе проверки только ghc и либы идущие с ним