ena
троечка, но способна через боль читать со словарем
ena
как у тебя с английским?
Cheese
ena
почему он не считатет это выражением?
Cheese
потому что объявление переменной не выражение
Cheese
переменные объявляют, чтобы их использовать
Cheese
в случае do-let переменные можно использовать только ниже объявления в этом блоке do
Cheese
если хочешь использовать выше объявления, замени let на where
ena
когда привыкаешь. меня все ещё раздражают ошибки с пробелами и сама парадигма функционального программирования
Но я должна себя пересилить с:
ena
во всяком случае, проще, чем в С++
parket
:t id @Int
Ага, даже так :) Спасибо.
А может моожно как-то так
forall a. a -> a @Int
parket
Ну, вы поняли
Alexander
тут пока ошибки с тем что даже хаскель во имя добра не внимательно прочитан
ena
Я для этого и пишу код чтобы понять что я не усвоила
Alexander
я ничего не говорю
Alexander
это нормально
Alexander
просто это не "ошибки с пробелами"
Alexander
А вы видите, да? Там уже аппликативы и point-free
Alexander
Alexander
у тебя там не forall
ena
костыль в лице return (var) поможет?
parket
ena
просто забить и написать все без let?
ena
А еще можно забить на let и вынести все эти функции (var, add, ...) на уровень функции main.
Alexander
не поможет
Alexander
поможет return (), чтобы он не ругался на не выражение
parket
/Это просто тип. forall a. a -> a. Хочу подставить вместо а конкретный тип, получить вывод.
Anonymous
Alexander
но у тебя var используется раньше чем объявляется и решение поставить спользование после
ena
А как же светлая идея с разделение вводы-вывода и функциональной части?
Alexander
просто забить и написать все без let?
Да, не мучить эту конструкцию, если она жить мешает.
А еще можно в do-блоке _каждую_ такую функцию снабдить своим let. Это обычно читабельнее (как мне кажется):
let var =
let add =
...
Но в конце все-таки должен быть вызов функции. Поэтому, пожалуй, правильным будет все эти let вставить в самое начало do-блока
parket
у тебя там не forall
Я ведь имею право подставить любой. Вот я и хочу подставить конкретный :)
ena
у меня перед глазами есть такой идеальный образец и я не понимаю почему он работает и конструкция с let - нет
Alexander
тут разделение никуда не теряется
Alexander
ты знаешь во что do syntax превращается?
ena
нет
Alexander
Alexander
у тебя же не Foo (forall a. ...)
Alexander
ena
Alexander
А не рановато?
ну хотя бы на каком-то уровне понимать надо, чтобы таких вопросов не было?
Alexander
не надо картинок плз, очень мешают читать и занимаю много места
parket
не имеешь
Мы друг друга не понимаем. Это тип функции id, и я могуд передать туда занчение любого типа. Например, типа Int. И получу Int. А ты о чем?
Alexander
Я расшифрую, что @A64m_qb0 сказал:
Без разницы, где функции определены в файле, если они определены на уровне твоей функции main. Они могут быть перемешаны как угодно. Haskell это допускает.
Но есть разница, как функции определены в do-блоке.
Alexander
ena
в моем случае послдней в main является строка
printf "Result is %f" var
Alexander
в приведенной картинке это было не так
Alexander
там после printf был let блок
Alexander
Alexander
Вот его, этот let, и нужно куда-то переместить.
ena
в чем тонкая разница?
ena
почему он не считатет это выражением?
ena
у меня перед глазами есть такой идеальный образец и я не понимаю почему он работает и конструкция с let - нет
ena
сначала надо писать вызываемую функцию? но тогда все опять скатывается в where
Alexander
твой код не соответствует коду в образце ну никак
Alexander
помести let выше print как уже сказали
Alexander
do { let x = y ; z } -> let x = y in z
Alexander
преобразования для do { let x = y } нету
Alexander
A64m
do
let decls
stmts
превращается в
let decls in do stmts
т.е. если stmts нету, получается некорректный синтаксический let in
Alexander
на них можно функции над типами писать, если нужно это
Alexander
а не подсказки в ghcu
Alexander
там можно :t id (undefined :: Int)
ena
спасибо. пошла осмыслять
ena
do
let decls
stmts
превращается в
let decls in do stmts
т.е. если stmts нету, получается некорректный синтаксический let in
Alexander
do { let x = y ; z } -> let x = y in z
Alexander
преобразования для do { let x = y } нету
Alexander
хотя то что выше более корректно
parket
кана