мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
Следующая версияСледующая версия справа и слева
haskell [17/07/2018 17:36] – [3.7 Определитель списков и диапазоны] vlasovhaskell [10/09/2018 12:53] – [2.1 Ветвления] vlasov
Строка 40: Строка 40:
 **Полезные команды** в ghci: **Полезные команды** в ghci:
  
-:q -- выйти из оболочки;+'':q'' -- выйти из оболочки;
  
-:l <имя программы> -- загрузить программу с указанным именем. Программа может не содержать модуля Main, а только определения функций (что мы и будем делать первое время);+'':l <имя программы>'' -- загрузить программу с указанным именем. Программа может не содержать модуля Main, а только определения функций (что мы и будем делать первое время);
  
-:r -- перегрузить текущий модуль;+'':r'' -- перегрузить текущий модуль;
  
-:t <имя функции> -- напечатать сигнатуру функции;+'':t <имя функции>'' -- напечатать сигнатуру функции;
  
-:i <имя функции> -- напечатать сигнатуру функции и указать, в каком файле была определена данная функция;+'':i <имя функции>'' -- напечатать сигнатуру функции и указать, в каком файле была определена данная функция;
  
 Кроме того, надо знать, что выражения в оболочке интерпретатора можно сразу вычислять. Кроме того, надо знать, что выражения в оболочке интерпретатора можно сразу вычислять.
-Наберем 2 + 2 и нажмем Enter, или наберем abs (-2) и нажмем Enter, и т.д.+Наберем 2 + 2 и нажмем Enter, или наберем ''abs (-2)'' и нажмем Enter, и т.д.
  
 Новые функции (пользовательские) можно задавать, как уже писалось выше, в отдельных файлах и подгружать по мере необходимости, либо сразу определять в оболочке: Новые функции (пользовательские) можно задавать, как уже писалось выше, в отдельных файлах и подгружать по мере необходимости, либо сразу определять в оболочке:
Строка 58: Строка 58:
 > let {f :: Int -> Int; f n = n * 2} > let {f :: Int -> Int; f n = n * 2}
 </code> </code>
 +
 +Отметим, что в версиях ''ghc/ghci'', начиная с 8.0.2, ключевое слово ''let'' писать необязательно.
  
 Многострочные записи делают следующим образом: Многострочные записи делают следующим образом:
Строка 76: Строка 78:
 </code> </code>
  
-Для просмотра тех или иных значений функции f можно попробовать набрать f 4, а для просмотра произвольного значения foo набрать show foo.+Для просмотра тех или иных значений функции ''f'' можно попробовать набрать ''f 4'', а для просмотра произвольного значения ''foo'' набрать ''show foo''.
  
  
Строка 90: Строка 92:
 и мы уже вряд ли сможем посчитать факториал с аргументом более 31. и мы уже вряд ли сможем посчитать факториал с аргументом более 31.
  
-Остальной код задан в виде уравнений, которые через сопоставление с образцами (pattern matching) задают нужное значение функции. Образцы рассматриваются по порядку.  +Остальной код задан в виде уравнений, которые через сопоставление с образцами (pattern matching) задают нужное значение функции. Образцы рассматриваются по порядку. Возможно использование рекурсии при описании функции. При вызове функций им передаются из аргументов выражения, вычисляемые по необходимости и это следует учитывать особенно при программировании рекурсивных функций, так возможен большой расход оперативной памяти (частично это как раз преодолевается грамотным использованием так называемой //ленивости вычислений//)
-Возможно использование рекурсии при описании функции. При вызове функций им передается копия аргументов и это следует учитывать особенно при программировании рекурсивных функций, так возможен большой расход оперативной памяти (частично это преодолевается грамотным использованием так называемой //ленивости вычислений//)+
  
 <code haskell> <code haskell>
Строка 136: Строка 137:
 В Haskell возможно описание вычисления функции в В Haskell возможно описание вычисления функции в
 зависимости от условий в более-менее традиционном ключе, для чего зависимости от условий в более-менее традиционном ключе, для чего
-присутствуют операторы if и case. Однако, их применение отлично от+присутствуют операторы ''if'' и ''case''. Однако, их применение отлично от
 аналогичных операторов в императивных языках. (Правильнее их называть аналогичных операторов в императивных языках. (Правильнее их называть
-выражениями с использованием case- и if-then-else-конструкций)+выражениями с использованием ''case-'' и ''if-then-else''-конструкций)
  
 <note>Тем не менее, семантика данного оператора в Haskell похожа на семантику тернарного оператора <note>Тем не менее, семантика данного оператора в Haskell похожа на семантику тернарного оператора
Строка 147: Строка 148:
 </note> </note>
  
-Оператор if предназначен для ветвления вычислительного процесса в +Ключевое слово ''if'' предназначено для указание на ветвление вычислительного процесса в 
-зависимости от условия булевского типа. Части then и else обязательны, они+зависимости от условия булевского типа. Части ''then'' и ''else'' обязательны, они
 в отличие от императивного аналога задают не порядок действий, а функции, в отличие от императивного аналога задают не порядок действий, а функции,
-которые возвращают результат для задаваемой функции. Данный оператор является +которые возвращают результат для задаваемой функции. Данное выражение является 
-частным, более простым случаем применения оператора case. +частным, более простым случаем применения выражений с ''case''
  
 Иными словами, условное выражение вида Иными словами, условное выражение вида
Строка 167: Строка 168:
 </code> </code>
  
-Рассмотрим более сложные примеры с case-выражениями:+Рассмотрим более сложные примеры с ''case''-выражениями:
  
 <code> <code>
Строка 182: Строка 183:
 </code> </code>
  
-Последний пример является комбинацией использования case-выражения с <<охраной>>+Последний пример является комбинацией использования ''case''-выражения с <<охраной>>
 для предотвращения применения функции для отрицательных аргументов. для предотвращения применения функции для отрицательных аргументов.
  
 Стоит также упомянуть, что задание функций уравнениями также возможно  Стоит также упомянуть, что задание функций уравнениями также возможно 
-рассматривать как упрощенную запись с соответствующими case-выражениями.+рассматривать как упрощенную запись с соответствующими ''case''-выражениями.
  
-**__Упражнение__.** Задать функцию sign(x) из предыдущего упражнения, используя ветвления с if и с case.+**__Упражнение__.** Задать функцию ''sign(x)'' из предыдущего упражнения, используя ветвления с ''if'' и ''с case''.
  
 ==== 2.2 Карринг и лямбда-абстракция ==== ==== 2.2 Карринг и лямбда-абстракция ====