Vladislav
Я не понял, ты в итоге в IO хочешь или нет?
Artyom
конечно не хочу я чувствую, что можно без IO сделать но у меня нет другого выхода, видимо
Vladislav
Брать s ~ RealWorld и делать stToIO это нормально, но ты уже runST не сделаешь.
Vladislav
Ты главное потом назад в ST не конвертируй.
Artyom
чесслово не буду
Anonymous
S
A64m
> The really new thing about release 0.06 is this: if you can get your program through the compiler, then it should actually work when you run it! все еще лучшая фича GHC, хотя пока еще и экспериментальная
Aliester
А корректная работа не обещается?
A64m
нет, пока просто работа, если повезет
A64m
это я старые release notes читаю, в новых-то фич нет
Alexander
а что за фича?
Aliester
The really new thing about release 0.06 is this: if you can get your program through the compiler, then it should actually work when you run it!
Alexander
а совсем древний релиз?
A64m
0.06
A64m
> There are several GHC features that raise vague questions in my mind about their implementation. It's hard to ask several questions that you can't put into words but one theme among these thoughts is whether GHC needs to generate code at runtime to implement certain features efficiently (e.g. thunks, partial evaluation). > Does GHC generate any native code at runtime?
A64m
как вообще он пришел к такому вопросу?
Leonid 🦇
Это откуда?
Aliester
Aliester
Когда понимаешь, что следующий час пройдет отлично
A64m
Это откуда?
https://www.reddit.com/r/haskell/comments/7mytdn/does_ghc_generate_machinenative_code_at_runtime/
Я правильно понимаю, что у stack, как и у pip с npm есть глобальная область и локальная?
Andrei
да, у stack есть т.н. global project
Andrei
не совсем так
Andrei
global project используется, когда не находится stack.yaml
А, понятно
Andrei
и local package database у него и пользовательского проекта разные
Теперь ясно стало, а то не мог stack-run поставить, а он локальный stack.yaml подхватывал
А что я тут не так делаю? Как правильно в ф-ю пользовательский ввод передать, а потом оттуда Bool вернуть? module Lib ( play ) where play = do welcomeMsg putStrLn "Enter the number:" setNumber <- readLn welcomeMsg :: IO () welcomeMsg = putStrLn "Start" setNumber :: Int -> Bool setNumber = do if x == 1 || x == 2 || x == 3 then putStrLn "OK" else putStrLn "Wrong number."
Meowbe/BSD-2-Clause
setNumber в IO
Meowbe/BSD-2-Clause
Можете вернуть IO Bool
Meowbe/BSD-2-Clause
then do putStrLn "..." return True
Спасибо, понял. А почему на строчку setNumber <- readLn ругается? The last statement in a 'do' block must be an expression
Meowbe/BSD-2-Clause
Потому что <- не даёт значения, это присваивание
Meowbe/BSD-2-Clause
Сделай в конце return () если для тестов просто
Cheese
putStrLn — процедура, и её нельзя использовать в функциях, только в процедурах
Vladislav
> это присваивание На всякий случай проясню, что это не в императивном смысле присваивание (значения переменной), а присваивание имени результату монадического действия.
Vladislav
Разделение на процедуры/функции условное весьма, лучше от типов отталкиваться.
Vladislav
Вот посмотрим на определение setNumber
Vladislav
Обещали тип: Int -> Bool.
Vladislav
А затем смотрим на определение: Int не приняли, Bool не вернули.
Vladislav
Должна быть следующая форма: setNumber = \x -> True, например.
Vladislav
Принимаем x как входной Int, возвращаем True как выходной Bool.
Vladislav
Я смотрю есть использование x в if, но лямбды, которая будет этот x принимать, нет.
Vladislav
А потом в результатах веток if возвращается putStrLn "str", который имеет тип IO ().
Vladislav
Обещал вернуть Bool, а вернул IO (), разве так годится?
Alexander
не надо обманывать людей, обманутые ожидание это плохо
Alexander
а вот начать с того, что в типе объявлено вернуть Bool а никакого возвращения Bool нету, можно было
Vladislav
Дальше я смотрю, что объявлена функция setNumber, а потом написано setNumber <- readLn. Мне кажется автор думает, что <- это передача в функцию, но это не так.
Anonymous
Тоже, почему бы не описать play для порядка?
Vladislav
Этот код заработает, если в setNumber сделать тип Int -> IO (), а <- заменить на =<<.
Vladislav
Потому что =<< это как раз оператор, чтобы передать результат одного IO действия в другое IO-действие.
Alexander
так что давайте начинать с какого-то начала
Alexander
:)
Alexander
я бы начал с типов, потом <- и вообще этой нотации без >>=`/=«` по очереди
Alexander
получится crash cource into the current exercise
Vladislav
Да вообще с IO в Haskell сразу начинать вредно, я бы по LYAH прошёлся спокойно, там все в хорошем порядке изложено
Vladislav
бесплатная книжка http://learnyouahaskell.com/chapters @valsaven
Alexander
не, если человек решает задачку то пусть решает
Alexander
а LYAH можно как bonus reading
Alexander
а то это печально сел решать, а тебя обругали на 100350 сообщений
Vladislav
Что проку решать задачку без основ, меня вот производную научили в школе брать, а смысл производной я понял только потом.
Спасибо, почитаю. Просто я на js пишу, немного на python. Захотелось посмотреть на чисто функциональный язык. Вот и пытаюсь знакомиться)
Alexander
статьи можно кинать?
Vladislav
знакомиться с чисто функциональным языком логично с чистых функций :)
Vladislav
а IO это для действий ввода-вывода, а не про функции
Alexander
[1] P. Wadler, The essence of functional programming. .
Vladislav
чтобы поиграться есть интерактивный repl - GHCi, в нем можно просто функции определять и вызывать
Alexander
@valsaven сможешь найти тескт, там немного по английски но простая и хорошая статья для того чтобы почувствовать о чем это функциональное программирование
Anonymous
Но ведь IO нужен для "здрассьте". Чем раньше его освоить, тем лучше.
Alexander
и если у тебя бы возникло, что-то вроде: interract "Enter the number" (bool "Ok" "Wrong number" . `elem` [1,2,3]) (скорее всего неверно код но близко), то было бы более ясно
Vladislav
> Просто я на js пишу, немного на python. Haskell будет сильно отличаться, тут еще типизация статическая, я думаю после JS или Python будет проще понять какой-нибудь Clojure, а потом перейти на Haskell, (ну или можно сразу хардкорно типы осваивать)
Anonymous
а clojure как здесь поможет 🤔
Alexander
в мире вокруг IO функциональное программирование близко к императивному
Alexander
можно не заметить слона
Vladislav
как js/python
Anonymous
так поэтому и нужно взять простой язык с типами