Участник:ХаскельСкрипт

Материал из ТХАБ.РФ
Перейти к: навигация, поиск

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 - онлайн компилятор Хасекль который позволяет использовать русские имена переменных и функций