Участник:ХаскельСкрипт — различия между версиями
Материал из ТХАБ.РФ
(→Let-In - 1.1 вариант - по русски) |
(→3-2) |
||
(не показано 9 промежуточных версий этого же участника) | |||
Строка 5: | Строка 5: | ||
=== Вычисление квадратного корня === | === Вычисление квадратного корня === | ||
+ | ==== по английски ==== | ||
+ | |||
+ | -- разрешение использовать не латинские имена переменных и функций (Unicod) | ||
+ | {-# LANGUAGE UnicodeSyntax #-} | ||
+ | -- Объявление функции возведения в квадрат | ||
square :: Int -> Int | square :: Int -> Int | ||
square v = v * v | square v = v * v | ||
+ | -- начало программы | ||
+ | main :: IO () | ||
+ | -- вводим возводим в квадрат | ||
+ | main = putStrLn $ show (square 2) | ||
+ | -- здесь мы имени основной программы Main присваиваем значение выводимое на терминал функцией putStrLn | ||
+ | -- т.к. функция putStrLn - принимает на вход только 1 текстовое значение | ||
+ | |||
+ | ==== По английски ==== | ||
+ | -- разрешение использовать не латинские имена переменных и функций (Unicod) | ||
+ | {-# LANGUAGE UnicodeSyntax #-} | ||
+ | -- Объявление функции возведения в квадрат | ||
+ | квадрат :: Int -> Int | ||
+ | квадрат число = число * число -- имена переменных и функций обязательно д.б. с маленькой буквы | ||
+ | -- начало программы | ||
+ | main :: IO () | ||
+ | -- вводим возводим в квадрат | ||
+ | main = putStrLn $ show (квадрат 2) | ||
=== Проба золота === | === Проба золота === | ||
Строка 225: | Строка 247: | ||
if | время < уставкаПоВремени -> время + сдвиг | if | время < уставкаПоВремени -> время + сдвиг | ||
-- оптимизируем код заменив нижнюю строку | -- оптимизируем код заменив нижнюю строку | ||
− | --| время >= уставкаПоВремени -> время + сдвиг + дельта | + | -- | время >= уставкаПоВремени -> время + сдвиг + дельта |
| otherwise -> время + дельта + сдвиг | | otherwise -> время + дельта + сдвиг | ||
Строка 233: | Строка 255: | ||
-- то необходимо с помощью $ show (вычислитьВремя 100) - преобразовать Int в String | -- то необходимо с помощью $ show (вычислитьВремя 100) - преобразовать Int в String | ||
main = putStrLn $ show (вычислитьВремя 100) | main = putStrLn $ show (вычислитьВремя 100) | ||
+ | |||
+ | === Let-In - 1.3 вариант - по русски === | ||
+ | |||
+ | Ещё больше ограничим область действия константы - дельта | ||
+ | |||
+ | {-# LANGUAGE UnicodeSyntax #-} -- разрешение использовать не латинские имена переменных и функций (Unicod) | ||
+ | {-# LANGUAGE MultiWayIf #-} -- включение расширения которое позволяет использовать множественный if | ||
+ | module Main where | ||
+ | -- функции | ||
+ | вычислитьВремя :: Int -> Int -- вычисление времени - возвращает Int | ||
+ | вычислитьВремя время = | ||
+ | let уставкаПоВремени = 40 | ||
+ | сдвиг = 120 | ||
+ | in | ||
+ | if | время < уставкаПоВремени -> время + сдвиг | ||
+ | -- оптимизируем код заменив нижнюю строку | ||
+ | | otherwise -> | ||
+ | let дельта = 8 in время + дельта + сдвиг | ||
+ | -- программа | ||
+ | main :: IO () | ||
+ | -- т.к. функция вычислитьВремя возвращает Int, а putStrLn принимает только строку | ||
+ | -- то необходимо с помощью $ show (вычислитьВремя 100) - преобразовать Int в String | ||
+ | main = putStrLn $ show (вычислитьВремя 100) | ||
+ | |||
+ | === 1-4 === | ||
+ | |||
+ | {-# LANGUAGE UnicodeSyntax #-} -- разрешение использовать не латинские имена переменных и функций (Unicod) | ||
+ | {-# LANGUAGE MultiWayIf #-} -- включение расширения которое позволяет использовать множественный if | ||
+ | module Main where -- подключение модуля | ||
+ | -- функции | ||
+ | вычислитьВремя :: Int -> Int -- вычисление времени - возвращает Int | ||
+ | вычислитьВремя время = | ||
+ | if | время < уставкаПоВремени -> время + сдвиг | ||
+ | | otherwise -> время + дельта + сдвиг | ||
+ | where -- константы и выражения указанные ниже действуют от начала функции до слова where | ||
+ | уставкаПоВремени = 40 | ||
+ | сдвиг = 120 | ||
+ | дельта = 8 | ||
+ | -- программа | ||
+ | main :: IO () | ||
+ | -- т.к. функция вычислитьВремя возвращает Int, а putStrLn принимает только строку | ||
+ | -- то необходимо с помощью $ show (вычислитьВремя 100) - преобразовать Int в String | ||
+ | main = putStrLn $ show (вычислитьВремя 100) | ||
+ | |||
+ | == 3 - операторы == | ||
+ | |||
+ | === 3-1 использование функции как оператора === | ||
+ | {-# LANGUAGE UnicodeSyntax #-} -- разрешение использовать не латинские имена переменных и функций (Unicod) | ||
+ | {-# LANGUAGE MultiWayIf #-} -- включение расширения которое позволяет использовать множественный if | ||
+ | module Main where | ||
+ | -- функция (оператор) сравнения | ||
+ | равно :: Int -> Int -> Bool | ||
+ | равно x y = x == y | ||
+ | --- функция корректировки времени | ||
+ | вычислитьВремя :: Int -> Int -- вычисление времени - возвращает Int | ||
+ | вычислитьВремя время = | ||
+ | let уставкаПоВремени = 40 | ||
+ | сдвиг = 120 | ||
+ | in | ||
+ | if | время < уставкаПоВремени -> время + сдвиг | ||
+ | | время `равно` уставкаПоВремени -> 1500 | ||
+ | -- оптимизируем код заменив нижнюю строку | ||
+ | | otherwise -> | ||
+ | let дельта = 8 in время + дельта + сдвиг | ||
+ | |||
+ | -- программа | ||
+ | main :: IO () | ||
+ | -- т.к. функция вычислитьВремя возвращает Int, а putStrLn принимает только строку | ||
+ | -- то необходимо с помощью $ show (вычислитьВремя 100) - преобразовать Int в String | ||
+ | main = putStrLn $ show (вычислитьВремя 40) | ||
+ | |||
+ | === 3-2 объявление функции как оператора - пока понятно как объявить использовать === | ||
+ | |||
+ | {-# LANGUAGE UnicodeSyntax #-} -- разрешение использовать не латинские имена переменных и функций (Unicod) | ||
+ | {-# LANGUAGE MultiWayIf #-} -- включение расширения которое позволяет использовать множественный if | ||
+ | module Main where | ||
+ | -- функция (оператор) сравнения | ||
+ | (равно) :: Int -> Int -> Bool | ||
+ | равно x y = x == y | ||
+ | --- функция корректировки времени | ||
+ | вычислитьВремя :: Int -> Int -- вычисление времени - возвращает Int | ||
+ | вычислитьВремя время = | ||
+ | let уставкаПоВремени = 40 | ||
+ | сдвиг = 120 | ||
+ | in | ||
+ | if | время < уставкаПоВремени -> время + сдвиг | ||
+ | | время равно уставкаПоВремени -> 1500 | ||
+ | -- оптимизируем код заменив нижнюю строку | ||
+ | | otherwise -> | ||
+ | let дельта = 8 in время + дельта + сдвиг | ||
+ | |||
+ | -- программа | ||
+ | main :: IO () | ||
+ | -- т.к. функция вычислитьВремя возвращает Int, а putStrLn принимает только строку | ||
+ | -- то необходимо с помощью $ show (вычислитьВремя 100) - преобразовать Int в String | ||
+ | main = putStrLn $ show (вычислитьВремя 40) | ||
== Ссылки == | == Ссылки == |
Текущая версия на 20:45, 3 ноября 2023
https://www.ohaskell.guide/setup.html
Содержание
Мои программы на Хаскель
Вычисление квадратного корня
по английски
-- разрешение использовать не латинские имена переменных и функций (Unicod) {-# LANGUAGE UnicodeSyntax #-} -- Объявление функции возведения в квадрат square :: Int -> Int square v = v * v -- начало программы main :: IO () -- вводим возводим в квадрат main = putStrLn $ show (square 2) -- здесь мы имени основной программы Main присваиваем значение выводимое на терминал функцией putStrLn -- т.к. функция putStrLn - принимает на вход только 1 текстовое значение
По английски
-- разрешение использовать не латинские имена переменных и функций (Unicod) {-# LANGUAGE UnicodeSyntax #-} -- Объявление функции возведения в квадрат квадрат :: Int -> Int квадрат число = число * число -- имена переменных и функций обязательно д.б. с маленькой буквы -- начало программы main :: IO () -- вводим возводим в квадрат main = putStrLn $ show (квадрат 2)
Проба золота
Проба золота - оригинал
analyzeGold :: Int -> String analyzeGold standard = if standard == 999 then "Wow! 999 standard!" else if standard == 750 then "Great! 750 standard." else if standard == 585 then "Not bad! 585 standard." else "I don't know such a standard..." main :: IO () main = putStrLn (analyzeGold 999)
Проба золота - По русски
-- разрешение использовать не латинские имена переменных и функций (Unicod) {-# LANGUAGE UnicodeSyntax #-} -- Объявление функции анализЗолота анализЗолота :: Int -> String анализЗолота проба = if проба == 999 then "Отлично! Это 999 проба!" else if проба == 750 then "Хорошо! 750 проба." else if проба == 585 then "Неплохо! 585 проба." else "Я не знаю что это за стандарт..."
main :: IO () -- вводим 999 пробу main = putStrLn (анализЗолота 999)
вариант 2 - английский
{-# LANGUAGE MultiWayIf #-} -- включение расширения которое позволяет использовать множественный if module Main where -- функции analyzeGold :: Int -> String analyzeGold standard = if | standard == 999 -> "Wow! 999 standard!" | standard == 750 -> "Great! 750 standard." | standard == 585 -> "Not bad! 585 standard." | otherwise -> "I don't know such a standard..." -- программа main :: IO () main = putStrLn (analyzeGold 999)
Вариант 2 - по русски
{-# LANGUAGE UnicodeSyntax #-} -- разрешение использовать не латинские имена переменных и функций (Unicod) {-# LANGUAGE MultiWayIf #-} -- включение расширения которое позволяет использовать множественный if module Main where -- Объявление функции анализЗолота анализЗолота :: Int -> String анализЗолота проба = if | проба == 999 -> "Отлично! Это 999 проба!" | проба == 750 -> "Хорошо! 750 проба." | проба == 585 -> "Неплохо! 585 проба." | otherwise -> "Я не знаю что это за проба..." main :: IO () -- вводим 999 пробу main = putStrLn (анализЗолота 750)
вариант 3 - английский
{-# LANGUAGE MultiWayIf #-} -- включение расширения которое позволяет использовать множественный if module Main where -- функции analyzeGold :: Int -> String analyzeGold standard | standard == 999 = "Wow! 999 standard!" | standard == 750 = "Great! 750 standard." | standard == 585 = "Not bad! 585 standard." | otherwise = "I don't know such a standard..." -- программа main :: IO () main = putStrLn (analyzeGold 999)
Вариант 3 - по русски
{-# LANGUAGE UnicodeSyntax #-} -- разрешение использовать не латинские имена переменных и функций (Unicod) {-# LANGUAGE MultiWayIf #-} -- включение расширения которое позволяет использовать множественный if module Main where -- Объявление функции анализЗолота анализЗолота :: Int -> String анализЗолота проба | проба == 999 = "Отлично! Это 999 проба!" | проба == 750 = "Хорошо! 750 проба." | проба == 585 = "Неплохо! 585 проба." | otherwise = "Я не знаю что это за проба..." -- программа main :: IO () -- вводим 999 пробу main = putStrLn (анализЗолота 750)
Хаскель - Сравнение с образцом (pattern matching)
вариант 1 - по английский
{-# LANGUAGE MultiWayIf #-} -- включение расширения которое позволяет использовать множественный if module Main where -- функции analyzeGold :: Int -> String -- Одно объявление функции -- И множество определений этой функции analyzeGold 999 = "Wow! 999 standard!" analyzeGold 750 = "Great! 750 standard." analyzeGold 585 = "Not bad! 585 standard." nalyzeGold _ = "I don't know such a standard..." -- программа main :: IO () main = putStrLn (analyzeGold 999)
вариант 1 - по русски
{-# LANGUAGE UnicodeSyntax #-} -- разрешение использовать не латинские имена переменных и функций (Unicod) {-# LANGUAGE MultiWayIf #-} -- включение расширения которое позволяет использовать множественный if module Main where -- функции анализЗолота :: Int -> String -- Одно объявление функции -- И множество определений этой функции анализЗолота 999 = "Wow! 999 standard!" анализЗолота 750 = "Хорошо! 750 standard." анализЗолота 585 = "Not bad! 585 standard." анализЗолота _ = "I don't know such a standard..." -- программа main :: IO () main = putStrLn (анализЗолота 750)
CASE - вариант 2 - по английский
{-# LANGUAGE MultiWayIf #-} -- включение расширения которое позволяет использовать множественный if module Main where -- функции analyzeGold standard = case standard of 999 -> "Wow! 999 standard!" 750 -> "Great! 750 standard." 585 -> "Not bad! 585 standard." _ -> "I don't know such a standard..." -- программа main :: IO () main = putStrLn (analyzeGold 999)
CASE - вариант 2 - по русски
{-# LANGUAGE UnicodeSyntax #-} -- разрешение использовать не латинские имена переменных и функций (Unicod) {-# LANGUAGE MultiWayIf #-} -- включение расширения которое позволяет использовать множественный if module Main where -- Модуль Main -- функции анализЗолота проба = case проба of 999 -> "Wow! 999 standard!" 750 -> "Хорошо! 750 standard." 585 -> "Not bad! 585 standard." _ -> "I don't know such a standard..." -- программа main :: IO () main = putStrLn (анализЗолота 750)
Пусть будет там, Где… Let In
Let-In - 1 вариант - английский
Все примеры с let DECLARATIONS in EXPRESSION - не работают т.к. нигде не объяснено что calculateTime :: Int -> Int, а для вывода результата через main = putStrLn (calculateTime 100) - требуется тип строка, надо конвертировать Int в String "main = putStrLn $ show (calculateTime 100)"
{-# LANGUAGE MultiWayIf #-} -- включение расширения которое позволяет использовать множественный if module Main where -- функции calculateTime :: Int -> Int -- вычисление времени calculateTime timeInS = let threshold = 40 correction = 120 delta = 8 in if | timeInS < threshold -> timeInS + correction | timeInS >= threshold -> timeInS + delta + correction -- программа main :: IO () --- main = putStrLn (calculateTime 100) -- не работает тк. на выходе calculateTime - Int а putStrLn принимает только строку main = putStrLn $ show (calculateTime 100) -- работает
Let-In - 1.1 вариант - по русски
{-# LANGUAGE UnicodeSyntax #-} -- разрешение использовать не латинские имена переменных и функций (Unicod) {-# LANGUAGE MultiWayIf #-} -- включение расширения которое позволяет использовать множественный if module Main where -- функции вычислитьВремя :: Int -> Int -- вычисление времени - возвращает Int вычислитьВремя время = let уставкаПоВремени = 40 сдвиг = 120 дельта = 8 in if | время < уставкаПоВремени -> время + сдвиг | время >= уставкаПоВремени -> время + сдвиг + дельта -- программа main :: IO () -- т.к. функция вычислитьВремя возвращает Int, а putStrLn принимает только строку -- то необходимо с помощью $ show (вычислитьВремя 100) - преобразовать Int в String main = putStrLn $ show (вычислитьВремя 100)
Let-In - 1.2 вариант - по русски
{-# LANGUAGE UnicodeSyntax #-} -- разрешение использовать не латинские имена переменных и функций (Unicod) {-# LANGUAGE MultiWayIf #-} -- включение расширения которое позволяет использовать множественный if module Main where -- функции вычислитьВремя :: Int -> Int -- вычисление времени - возвращает Int вычислитьВремя время = let уставкаПоВремени = 40 сдвиг = 120 дельта = 8 in if | время < уставкаПоВремени -> время + сдвиг -- оптимизируем код заменив нижнюю строку -- | время >= уставкаПоВремени -> время + сдвиг + дельта | otherwise -> время + дельта + сдвиг -- программа main :: IO () -- т.к. функция вычислитьВремя возвращает Int, а putStrLn принимает только строку -- то необходимо с помощью $ show (вычислитьВремя 100) - преобразовать Int в String main = putStrLn $ show (вычислитьВремя 100)
Let-In - 1.3 вариант - по русски
Ещё больше ограничим область действия константы - дельта
{-# LANGUAGE UnicodeSyntax #-} -- разрешение использовать не латинские имена переменных и функций (Unicod) {-# LANGUAGE MultiWayIf #-} -- включение расширения которое позволяет использовать множественный if module Main where -- функции вычислитьВремя :: Int -> Int -- вычисление времени - возвращает Int вычислитьВремя время = let уставкаПоВремени = 40 сдвиг = 120 in if | время < уставкаПоВремени -> время + сдвиг -- оптимизируем код заменив нижнюю строку | otherwise -> let дельта = 8 in время + дельта + сдвиг -- программа main :: IO () -- т.к. функция вычислитьВремя возвращает Int, а putStrLn принимает только строку -- то необходимо с помощью $ show (вычислитьВремя 100) - преобразовать Int в String main = putStrLn $ show (вычислитьВремя 100)
1-4
{-# LANGUAGE UnicodeSyntax #-} -- разрешение использовать не латинские имена переменных и функций (Unicod) {-# LANGUAGE MultiWayIf #-} -- включение расширения которое позволяет использовать множественный if module Main where -- подключение модуля -- функции вычислитьВремя :: Int -> Int -- вычисление времени - возвращает Int вычислитьВремя время = if | время < уставкаПоВремени -> время + сдвиг | otherwise -> время + дельта + сдвиг where -- константы и выражения указанные ниже действуют от начала функции до слова where уставкаПоВремени = 40 сдвиг = 120 дельта = 8 -- программа main :: IO () -- т.к. функция вычислитьВремя возвращает Int, а putStrLn принимает только строку -- то необходимо с помощью $ show (вычислитьВремя 100) - преобразовать Int в String main = putStrLn $ show (вычислитьВремя 100)
3 - операторы
3-1 использование функции как оператора
{-# LANGUAGE UnicodeSyntax #-} -- разрешение использовать не латинские имена переменных и функций (Unicod) {-# LANGUAGE MultiWayIf #-} -- включение расширения которое позволяет использовать множественный if module Main where -- функция (оператор) сравнения равно :: Int -> Int -> Bool равно x y = x == y --- функция корректировки времени вычислитьВремя :: Int -> Int -- вычисление времени - возвращает Int вычислитьВремя время = let уставкаПоВремени = 40 сдвиг = 120 in if | время < уставкаПоВремени -> время + сдвиг | время `равно` уставкаПоВремени -> 1500 -- оптимизируем код заменив нижнюю строку | otherwise -> let дельта = 8 in время + дельта + сдвиг -- программа main :: IO () -- т.к. функция вычислитьВремя возвращает Int, а putStrLn принимает только строку -- то необходимо с помощью $ show (вычислитьВремя 100) - преобразовать Int в String main = putStrLn $ show (вычислитьВремя 40)
3-2 объявление функции как оператора - пока понятно как объявить использовать
{-# LANGUAGE UnicodeSyntax #-} -- разрешение использовать не латинские имена переменных и функций (Unicod) {-# LANGUAGE MultiWayIf #-} -- включение расширения которое позволяет использовать множественный if module Main where -- функция (оператор) сравнения (равно) :: Int -> Int -> Bool равно x y = x == y --- функция корректировки времени вычислитьВремя :: Int -> Int -- вычисление времени - возвращает Int вычислитьВремя время = let уставкаПоВремени = 40 сдвиг = 120 in if | время < уставкаПоВремени -> время + сдвиг | время равно уставкаПоВремени -> 1500 -- оптимизируем код заменив нижнюю строку | otherwise -> let дельта = 8 in время + дельта + сдвиг -- программа main :: IO () -- т.к. функция вычислитьВремя возвращает Int, а putStrLn принимает только строку -- то необходимо с помощью $ show (вычислитьВремя 100) - преобразовать Int в String main = putStrLn $ show (вычислитьВремя 40)
Ссылки
- https://www.ohaskell.guide/setup.html - учебник по Хаскелю откуда русифицируются примеры для лучшего понимания
- https://replit.com - онлайн компилятор Хасекль который позволяет использовать русские имена переменных и функций