Участник:ХаскельСкрипт
Материал из ТХАБ.РФ
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 - онлайн компилятор Хасекль который позволяет использовать русские имена переменных и функций