
Alex
21.10.2018
06:24:53
Получил следующее
play :: (Coord, Coord) -> Coord -> IO ()
play area loc =
nextWindow <$> new_area >>= print >>
(join $ play <$> new_area <*> new_coord)
where
new_area = (nextArea loc area) <$> getLine
new_coord = nextWindow <$> new_area
Однако, работает не корректно, первый вызво функции корректен, а потом как-будто getLine работает раз через два

Yuriy
21.10.2018
06:25:59
попробуй рассахарить сначала стандартным способом

Alex
21.10.2018
06:33:48
спасибо, попробую, а случайно нет некаких особенностей с join в IO-монаде? эффекты вложенной монады выполняются?
хотя похоже что да - я пробовал менять getLine на return "some string" и функция ожидамо бесконечно печатала

Google

Dmitry
21.10.2018
06:38:15
putStrLn $ (show new_coord) = print new_coord. Кстати, лучше бы newCoord.

Alex
21.10.2018
06:40:04
да, я вспомнил про print уже когда операторную версию писал

Yuriy
21.10.2018
07:23:44

Terminator
21.10.2018
08:52:08
@extlife будет жить. Поприветствуем!
Vasiliy N будет жить. Поприветствуем!

Alexander
21.10.2018
09:49:26
интересно сколько иностранцев банит терминатор

Pineapple
21.10.2018
09:52:21
50%, наверное

Alexander
21.10.2018
09:59:26
50%, наверное
Не забывайте о тех, кто просто не нажимает. Так что ~ 25%

Alexander
21.10.2018
10:07:59
там разве счётчика нету?
типа отвечай у тебя только минута

Dmitry
21.10.2018
10:21:01
Есть
Не все успевают перевести
Наверное

Google

Mikhail
21.10.2018
11:37:40
Народ, подскажите по докеру
FROM haskell:7.10
RUN cabal update
# Add .cabal file
ADD ./cabal-example.cabal /opt/server/cabal-example.cabal
# Docker will cache this command as a layer, freeing us up to
# modify source code without re-installing dependencies
RUN cd /opt/server && cabal install --only-dependencies -j4
# Add and Install Application Code
ADD ./src /opt/server/src
ADD ./LICENSE /opt/server/LICENSE
RUN cd /opt/server && cabal install
# Add installed cabal executables to PATH
ENV PATH /root/.cabal/bin:$PATH
# Default Command for Container
WORKDIR /opt/server/
CMD ["cabal-example"]
Это мой докерфайл.
Контейнер собирается, но
$ docker run -p 3000:3000 cabal-example
Unable to find image 'cabal-example:latest' locally

Artyom
21.10.2018
11:42:26
docker build … -t cabal-example

Mikhail
21.10.2018
11:42:48
это все проходит успешно

Artyom
21.10.2018
11:43:23
Я про то, что надо тег поставить

Mikhail
21.10.2018
11:44:04
спасибо)
заработало

Terminator
21.10.2018
12:54:58
@GlazedCurd будет жить. Поприветствуем!
@IvanovPvl будет жить. Поприветствуем!

Mikhail
21.10.2018
15:33:57
Теперь бьюсь с деплоем приложения на heroku
## docker build . -t cabal-example
## docker run -p 80:80 cabal-example
## heroku container:login
## heroku create
## heroku container:push web --app ${YOUR_APP_NAME}
## heroku open --app ${YOUR_APP_NAME}
Все проходит без ошибок, но
в результате вижу типовую их стартовую страницу
А не то, что вижу на localhost
работаю только с 80 портом

Nikita
21.10.2018
16:19:53
на каком порту приложение принимает соединение?
https://devcenter.heroku.com/articles/container-registry-and-runtime#dockerfile-commands-and-runtime

Google

Nikita
21.10.2018
16:20:20
должен быть тот, который установлен в переменной PORT

Mikhail
21.10.2018
16:25:12
добавил в Config vars переменную PORT со значением 80. Не помогает
попробую добавить в Dockerfile EXPOSE 80
Хотя в докере и так работает, проблема в Heroku

Nikita
21.10.2018
16:29:41
нельзя задать значение этой переменной, она передается окружением heroku, ее значение нужно использовать для запуска веб-сервера на нужно порту

Mikhail
21.10.2018
16:35:33
пробую ENV PORT 80 в докерфайл

Nikita
21.10.2018
16:40:13
мда. у тебя должна быть команда задана в докерфайле для запуска приложение, что-то вроде RUN myapp, в самом приложении нужно взять порт из переменной окружения, на нем начать принимать соединения. Вроде бы ничего сложного, можно поискать примеры
не RUN, а CMD только, перепутал

Terminator
21.10.2018
16:48:00
@sushilshik будет жить. Поприветствуем!

Mikhail
21.10.2018
16:48:35
Само приложение там пока хэлловорлд
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Network.HTTP.Types
import Network.Wai
import Network.Wai.Handler.Warp (run)
app :: Application
app _ respond = do
putStrLn "I've done some IO here"
respond $ responseLBS
status200
[("Content-Type", "text/plain")]
"Hello, Web!"
main :: IO ()
main = do
putStrLn "http://localhost:80/"
run 80 app
успешно запускается командой
docker run -p 80:80 cabal-example
на localhost

Nikita
21.10.2018
16:54:14
осталось добавить что-то вроде port <- getEnv "PORT" перед run ... app, а многоточие заменить на каст port к Integer

Mikhail
21.10.2018
17:02:55
cabal-example: PORT: getEnv: does not exist (no environment variable)
хотя возможно это из System.Posix.Env
но вроде нигде в мануалах не упомянуты пляски с бубном и получение порта

Nikita
21.10.2018
17:10:18
1) это не пляски с бубном 2) я выше скинул ссылку на доку 3) сама идея брать порт из переменной окружения все-таки специфична для хероку, это так. Но в этом нет никакой проблемы

Google

Nikita
21.10.2018
17:10:58
теперь нужно будет самому тоже передавать переменную

Mikhail
21.10.2018
17:11:06
так это работает
не работает только в Heroku

Nikita
21.10.2018
17:13:49
нужно проверить как переменную считывать, тут целый чят экспертов, пусть подскажут

Mikhail
21.10.2018
17:17:23
да, возможно heroku перенаправляет с 80 порта на другой, и проблема из-за этого
прошло
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Network.HTTP.Types
import Network.Wai
import Network.Wai.Handler.Warp (run)
--import Data.Maybe
import System.Environment (getEnv)
app :: Application
app _ respond = do
putStrLn "I've done some IO here"
respond $ responseLBS
status200
[("Content-Type", "text/plain")]
"Hello, Web!"
main :: IO ()
main = do
port <- read <$> getEnv "PORT"
run port app
спасибо за правильную ссылку

Terminator
21.10.2018
19:42:42
Ilya Rusin будет жить. Поприветствуем!

Mikhail
22.10.2018
11:12:12
Люди, вы практикуете TDD? Возникла мысль сделать вебсайт, где есть два вида участников - одни выкладывают запросы на написание pure функций, другие пишут эти функции. Первые делают аплоад файла .cabal и тестов, устанавливают ограничения по количеству строк. Вторые пишут решения, бэкенд прогоняет решения по тестам, проверяет ограничение по количеству строк, в случае успеха тестов моментальная выплата криптой
Идея слишком масштабная чтоб реализовать на коленке. Интересно, востребованно ли оно будет?

Alexander
22.10.2018
11:12:52
type driven development?

Mikhail
22.10.2018
11:13:13
TEST DRIVEN DEV-T

Ilya
22.10.2018
11:13:50

Artyom
22.10.2018
11:13:55
:vanga: Твой сайт будут в основном использовать для домашних заданий, потому что он идеально для этого подходит (тесты уже даны)

Ilya
22.10.2018
11:13:59
Зачем тут две стороны тогда

Alexander
22.10.2018
11:15:06
я не очень вижу большого смысла в сервисе в такой постановке

Artyom
22.10.2018
11:15:08
А бизнес его использовать не будет, потому что если даже мне надо написать парсер регекспов для проекта, я его не буду просить сделать на сайте, где основной контингент -- нерадивые студенты

Alexander
22.10.2018
11:15:22
взлететь может если убрать чистоту и иметь DSL для написания интеграционных тестов

Google

Mikhail
22.10.2018
11:15:23