Пример выполнения лабораторной работы 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!