Пример выполнения лабораторной работы 1.
1. Вычислите числовое выражение.
Решение. При наборе выражения советуем писать действия постепенно и проверять результат для упрощения обнаружения возможных ошибок:
2. Истинно ровно одно утверждение : 1) Наибольший общий делитель элементов кортежа (51, 60) не превосходит второго элемента списка [1,2,3,4,5] 2) символ, предшествующий ’r’ входит в строку, склеенную из строк «Haskell» «is» «cool».
Решение.
Выражение «Истинно ровно одно утверждение из 2» подразумевает логическую операцию – сумму по модулю 2 : . Но в Haskell имеются только встроенные логические функции not, ||, && - отрицание, дизъюнкция и конъюнкция. Можно выразить через них сумму по модулю 2 следующим образом: . Но можно поступить проще, и составить выражение 1 /= 2 (1 не равно 2), действительно, оно будет истинно, когда ровно 1 из выражений 1 или 2 будет истинно, а второе ложно.
Теперь составим сами выражения 1 и 2:
… Наибольший общий делитель элементов кортежа (51, 60) …
доступ к элементам кортежа осуществляется с помощью функций fst и snd (к первому и второму соответственно), а НОД получается с помощью встроенной функции gcd
… Наибольший общий делитель элементов кортежа (51, 60) …- gcd (fst (51,60)) (snd (51,60))
…второго элемента списка [1,2,3,4,5] …. - [1,2,3,4,5] !! 2
Окончательно, первое утверждение
1) Наименьшее общее кратное элементов кортежа (51, 60) не превосходит второго элемента списка [1,2,3,4,5]
(gcd (fst (51,60)) (snd (51,60)))<= [1,2,3,4,5] !! 2.
|
|
Составим выражение для утверждения 2) символ, предшествующий ’r’ входит в строку, склеенную из строк «Haskell» «is» «cool».
…символ, предшествующий ’r’… - pred 'r'
…склеенную из строк «Haskell» «is» «cool»… - «Haskell»++ «is»++ «cool»
Функция проверки вхождения элемента – elem. Тогда окончательно для выражения 2 имеем:
символ, предшествующий ’r’ входит в строку, склеенную из строк «Haskell» «is» «cool».
(pred 'r') `elem` «Haskell»++ «is»++ «cool»
(так как функция elem использована в инфиксной форме, то заключена в специальные кавычки).
Осталось написать каждое из выражений в скобках и проверить на неравенство:
((gcd (fst (51,60)) (snd (51,60)))<= [1,2,3,4,5] !! 2) /=( (pred 'r') `elem` «Haskell»++ «is»++ «cool»)
3. Получите списки с помощью генератора списков
а) арифметическую прогрессию с первым элементом и разностью , с элементами, не превышающими значения . (в варианте указаны три числа, соответствующие , и , соответственно);
4, 6, 102;
б) центрированные восьмиугольные числа;
в) список всех 4-буквенных «слов», образованных из различных букв слова «program»
Решение.
а)
б) Предварительно найдем описание центрированных восьмиугольных чисел, например, в Википедии.
Теперь запишем генератор списка и возьмем первые 20 элементов:
|
|
в) список всех 4-буквенных «слов», образованных из различных букв слова «program»
(показан пример только нескольких первых строк)
4. Функцию myexpr(определив самостоятельно тип и необходимое число аргументов), позволяющую вычислить выражение из задания 1. Убедитесь в равенстве ответов. Продемонстрируйте работу функции при каких-нибудь 3 наборах аргументов, отличных от начальных (в задании 1).
Решение.
Анализируя выражение замечаем, что в нем повторяются числа 4.18 и 9.03. Заменим их аргументами x и y и запишем в файле выражение, повторяющее запись из задания 1:
Сохраним файл с расширением *.hs, закроем его и вернемся в интерпретатор. Откроем файл с помощью верхней кнопки на левой панели и вызовем нашу функцию с параметрами 4.18 и 9.03. Убеждаемся, что ответ совпадает с полученным в задании 1. Вызовем функцию еще пару раз с разными параметрами:
5. а) Сравнить первый и последний элементы числового списка и удалить минимальный из них.
Исходный код:
Пояснение: | (head l)<(last l) = drop 1 l - если первый элемент списка l меньше последнего, то вернуть список без 1-го первого элемента (вместо drop 1 l можно было бы написать tail l). | otherwise = init l – иначе вернуть список без последнего элемента.
|
|
Пример работы функции в интерпретаторе:
б) Заменить в заданном списке первый и второй элементы на первый и второй элементы заданного кортежа.
Решение.
Текст программы:
Пример выполнения:
Лабораторная работа 2.
Дата добавления: 2019-03-09; просмотров: 484; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!