Участник:ХаскельСкрипт — различия между версиями
Материал из ТХАБ.РФ
(→Let-In - 1.1 вариант - по русски) |
(→Вычисление квадратного корня) |
||
Строка 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 текстовое значение | ||
=== Проба золота === | === Проба золота === |
Версия 17:34, 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 текстовое значение
Проба золота
Проба золота - оригинал
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)
Ссылки
- https://www.ohaskell.guide/setup.html - учебник по Хаскелю откуда русифицируются примеры для лучшего понимания
- https://replit.com - онлайн компилятор Хасекль который позволяет использовать русские имена переменных и функций