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