CyberForum.ru - Форум программистов и сисадминов
Вернуться   Форум программистов и сисадминов CyberForum.ru > Форум программистов > Форум Другие языки программирования > Форум Haskell

Ответ Создать новую тему
 
Старый 30.01.2012, 10:44   #1
Buckminster
Форумчанин
 
Аватар для Buckminster
 
Регистрация: 30.01.2012
Сообщений: 714
Репутация: 1004 (676)
По умолчанию Ввод данных, локальные переменные и область видимости

добрый день! вопрос по приведенному коду: имеется ли возможность сформировать локальную переменную на основе введенных параметров и использовать ее многократно при выводе результатов? программа находит среднее значение ряда чисел, определяемого на основе запрашиваемых с клавиатуры параметров x1 и x2... искомый ряд чисел формируется функцией threeDigMasked x1 x2... было бы удобно поместить значение функции в промежуточную переменную, но в блоке where параметры x1 и x2 не видны... или здесь поможет только оформление вывода отдельной функцией (возможно, локальной -- пришло в голову пока писал вопрос )? но вопрос в любом случае остается: возможно ли формирование локальных переменных на основе IO-образцов или здесь вступают в силу какие-то принципиальные ограничения языка?

Код
1
2
3
4
5
6
7
8
main = do x1 <- readNum 
          x2 <- readNum
          putStrLn $ show (threeDigMasked x1 x2)
          putStrLn $ show (length $ threeDigMasked x1 x2)
          putStrLn $ show (sum $ threeDigMasked x1 x2)
          putStrLn $ show (listAvg $ threeDigMasked x1 x2)
        where readNum :: IO Integer
              readNum = readLn
Buckminster вне форума
Другие темы раздела
Haskell Haskell, работа с графом.
Написать библиотеку функций и главную программу, реализующие работу с графами. Граф общего вида: динамическая структура. Должны быть реализованы функции для интерактивного задания, чтения из файла, записи в файл, поиска по графу, поиск в ширину. помогите пожалуйста!!!!! буду безмерно благодарен!!!.... Haskell, работа с графом.
Монада State Haskell
Здравствуйте, помогите разобраться с монадой State, на примере автоматов. Автомат для разбора дробного числа, принимает состояние и символ, возвращает новое состояние: float :: Int -> Char -> Int float (-1) _ = -1 float 0 x | (num x) = 1 | otherwise = -1 float 1 x. Монада State
Старый 30.01.2012, 14:10   #2
Nameless One
Модератор
Эксперт C++
 
Аватар для Nameless One
 
Регистрация: 08.02.2010
Сообщений: 5,472
Репутация: 3727 (2192)
По умолчанию Re: Ввод данных, локальные переменные и область видимости

Код Haskell
1
2
3
4
5
6
main = do x1  <- readLn :: IO Int
          x2  <- readLn :: IO Int
          let series = [x1..x2]
          print $ length series
          print $ sum series
          print $ product series
ЗЫ. putStrLn . show = print

Последний раз редактировалось Петррр; 01.04.2012 в 11:03.
Nameless One вне форума
Старый 30.01.2012, 14:25   #3
Nameless One
Модератор
Эксперт C++
 
Аватар для Nameless One
 
Регистрация: 08.02.2010
Сообщений: 5,472
Репутация: 3727 (2192)
По умолчанию Re: Ввод данных, локальные переменные и область видимости

Цитата Сообщение от Buckminster Посмотреть сообщение
но в блоке where параметры x1 и x2 не видны
они и не могут быть видны. do-нотация — это на самом деле синтаксический сахар; например, следующие два
фрагмента будут аналогичны:
Код Haskell
1
2
3
4
5
6
7
8
9
10
11
main = do x1 <- readNum
          x2 <- readNum
          print $ length series
    where readNum :: IO Integer
          readNum = readLn
          series = threeDigMasked x1 x2[/code][code]main = readNum >>= \x1 ->
       readNum >>= \x2 ->
       print $ length [x1..x2]
           where  readNum :: IO Integer
                  readNum = readLn
                  series = threeDigMasked x1 x2
естественно, формальные параметры анонимных функций не могут быть видны в блоке where.
В то время, как вариант
Код Haskell
1
2
3
4
5
6
main = do x1 <- readNum
          x2 <- readNum
          let series = [x1..x2]
          print $ length series
    where  readNum :: IO Integer
           readNum = readLn
разворачивается в
Код Haskell
1
2
3
4
5
6
main = readNum >>= \x1 ->
       readNum >>= \x2 ->
       let series = [x1..x2] in
       print $ length series
           where  readNum :: IO Integer
                  readNum = readLn
Почувствуй разницу ©
Подробнее про do-нотацию: http://book.realworldhaskell.org/rea...html#monads.do

Последний раз редактировалось Петррр; 01.04.2012 в 11:14.
Nameless One вне форума
Старый 30.01.2012, 15:07  [ТС]   #4
Buckminster
Форумчанин
 
Аватар для Buckminster
 
Регистрация: 30.01.2012
Сообщений: 714
Репутация: 1004 (676)
По умолчанию Re: Ввод данных, локальные переменные и область видимости

Цитата Сообщение от Nameless One Посмотреть сообщение
Код
1
let series = [x1..x2]
Nameless One, огромное спасибо! всё так просто и незамысловато...
т.е. в do-нотации допускается изолированное использование оператора let вне блока let-in... насколько я понял, let x = y синонимично x <- return y, в то время как я пытался выполнить присваивание через x <- y без оборачивания в контейнер...
Buckminster вне форума
Старый 30.01.2012, 15:10   #5
Nameless One
Модератор
Эксперт C++
 
Аватар для Nameless One
 
Регистрация: 08.02.2010
Сообщений: 5,472
Репутация: 3727 (2192)
По умолчанию Re: Ввод данных, локальные переменные и область видимости

Цитата Сообщение от Buckminster Посмотреть сообщение
т.е. в do-нотации допускается изолированное использование оператора let вне блока let-in
да
Цитата Сообщение от Buckminster Посмотреть сообщение
насколько я понял, let x = y синонимично x <- return y
можно, в принципе, и так сказать
Nameless One вне форума
После регистрации реклама в сообщениях будет скрыта
Старый 30.01.2012, 15:50  [ТС]   #6
Buckminster
Форумчанин
 
Аватар для Buckminster
 
Регистрация: 30.01.2012
Сообщений: 714
Репутация: 1004 (676)
По умолчанию Re: Ввод данных, локальные переменные и область видимости

Цитата Сообщение от Nameless One Посмотреть сообщение
можно, в принципе, и так сказать
благодаря наводке обнаружил вот эту статью, которая объясняет некоторые особенности do-нотации:
The main function starts with do, then has a sequence of xI <- exprI statements, and ends with return ().
Each statement has a pattern on the left of the arrow (often just a variable), and an expression on the right.
If the expression is not of type IO, then you must write xI <- return (exprI).
...people usually simplify the code using the following three rules:
1. _ <- x can be rewritten as x.
2. If the penultimate line doesn't have a binding arrow (<-) and is of type IO (), then the return () can be removed.
3. x <- return y can be rewritten as let x = y (provided you don't reuse variable names).
беглый просмотр справочника Душкина этих особенностей не выявил (и вообще я как-то не обнаружил нигде, чтобы на этом моменте фокусировалось внимание), откуда и родился вопрос...
ещё раз спасибо за квалифицированную помощь и исчерпывающие объяснения...
Buckminster вне форума
Ответ Создать новую тему

Похожие темы
Тема Автор
С++ для начинающих Область видимости
Даю фрагмент программы: #include <iostream> #include <stdio.h> #include <cmath> struct elem //тип элемента двусвязного списка { float st, kf; elem *next,*pred; };
casabonita
С++ для начинающих Область видимости
func { int someVariable; { int someVariable; //можно ли как нибудь получить доступ к переменной обьявленной ниже ? } }
Saiberg
Java Область видимости
Почему выпадает ошибка, что переменная scanner не инициализирована? По идее она не должна быть локальной в try. if (o instanceof User) { path = "C:\\Users\\Doctor\\IdeaProjects\\OnlineStore\\files\\users.txt"; File file = new File(path); ...
D.o.c.t.o.r
Pascal (Паскаль) «Структура процедур. Область действия переменных. Глобальные и локальные переменные»
Даны натуральные числа от 1 до 50. Найти сумму тех из них, которые делятся на 5 или на 7.
Altrex
С++ для начинающих Область видимости в С++
В книге С++ Бархатный путь. ( http://khpi-iip.mipk.kharkiv.edu/library/extent/prog/cppvw/cpp_047.html) сказано, что область действия имен объявленных в заголовке цикла попадает в общее пространство имен и такие два подряд оператора содержат ошибку: for (int i=0;i<4;i++) {// что-там} ; for...
Ketino
Опции темы

Текущее время: 16:37. Часовой пояс GMT +4.

Компьютерный форум программистов и сисадминов
Powered by vBulletin® Version 3.8.7 PL2
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Рейтинг@Mail.ru