#типи — Public Fediverse posts
Live and recent posts from across the Fediverse tagged #типи, aggregated by home.social.
-
CW: Кортежі у :haskell:
Кортежі — це гетерогенні структури даних, фіксованої довжини, та з елементами здебільшого різних типів.
Створюються вони за допомоги бінарного оператора
(,).> (,) 'c' True ('c',True)При цьому в нас виходить двох елементний кортеж, часто його ще називають парою. Але кортежі можуть бути й довші, або коротші.
Найкоротший кортеж - це порожній кортеж.
> () ()Якщо нам потрібно більше елементів, то значить треба додати більше ком. Але кортежу довжиною в один елемент не існує, оскільки синтаксично його не можливо створити через те що елемент в дужках, наприклад
(3), це просто групування.> (,,) 4 'a' False (4,'a',False) > (,,,) 4 'a' False "Haskell" (4,'a',False,"Haskell")Але створювати таким синтаксисом не дуже зручно, оскільки нам постійно потрібно рахувати кількість аргументів, й вказувати відповідну кількість ком, на одну менше за значень. Для спрощення, синтаксис хаскеля трохи підцукрили, й дозволили робити нам так як вони відображаються.
> (4, 'a', False, "Haskell") (4,'a',False,"Haskell")Тепер перейдемо до їхніх типів.
Нагадую: простори імен типів та всього іншого відокремлені.
Тип кортежів це
().> :t () () :: ()Якщо це не порожній кортеж, то й тип не порожній.
> :t ('c', True) ('c', True) :: (Char, Bool)Це все добре, але треба якось же із ними працювати й отримувати окремі елементи. У стандартній бібліотеці для цього є кілька готових функцій, наприклад візьмемо
fstкотра повертає перший елемент, таsndкотра повертає другий елемент.> p = (1,2) > fst p 1 > snd p 2Ці функції працюють тільки з парами, і реалізовуються через зіставлення.
fst (x,_) = x snd (_,y) = y -
Як же мене після
C++навіть наPythonтягне оптимізувати там де ніхто не звертає уваги. До прикладу багато хто використовує всюди списки дам де це не потрібно і можна взяти кортеж.Обʼєкт типу
objectзаймає16 BYTES. Це можна дізнатись викликавши метод__sizeof__в обʼєкта.o = object() o.__sizeof__()Від цього типу наслідуються всі інші стандартні й не тільки типи навіть якщо явно цього не вказано. Тому це найменший можливий розмір будь-якого обʼєкта. Перевірити це можна за допомоги функції
issubclassяка приймає два типи та повертає значення типуbool.>>> issubclass(int, object) True >>> issubclass(float, object) True >>> issubclass(bool, object) True >>> issubclass(str, object) True >>> issubclass(list, object) True >>> issubclass(tuple, object) True >>> class A: ... pass ... >>> issubclass(A, object) TrueСаме через це всі обʼєкти мають функцію
__sizeof__і не тільки.Якщо ми подивимось на розміри стандартних типів, то можемо трохи здивуватись.
>>> int().__sizeof__() 28 >>> float().__sizeof__() 24 >>> bool().__sizeof__() 28 >>> str().__sizeof__() 49 >>> tuple().__sizeof__() 24 >>> list().__sizeof__() 40 >>> set().__sizeof__() 200 >>> dict().__sizeof__() 48Найбільше я здивувався розміру типу
bool. Він займає скільки ж як іint, і є більшим заfloatтаtuple. І це все розміри порожніх (нульових) обʼєктів.Тепер порівняємо кортежі та списками з однаковим вмістом.
>>> t = (1,2,3,4,5,6) >>> l = [1,2,3,4,5,6] >>> t.__sizeof__() 72 >>> l.__sizeof__() 88Різниця та ж що й при порожніх контейнерах через те що контейнер зберігає тільки посилання на обʼєкт. Можемо в цьому переконатись за id обʼєктів.
>>> id(t[0]) == id(l[0]) True >>> t[0] is l[0] TrueОператор
isробить те саме, він порівнює ідентифікатори.Це добре що
pythonоптимізує програму не створюючи зайвих обʼєктів, але всеодно всі обʼєкти займають дуже багато місця. Саме через це я й ненавиджу такі мови якpython,js...#програмування #python #sizeof #розміри #типи #int #float #list #tuple #списки #кортежі #sizeof #object #оптимізація #бісить
-
CW: Типи в :haskell:
Haskell є строго статично типізованою мовою програмування, але з можливістю автоматичного виведення типів. В усіх наших попередніх програмах ми ніде не вказували типи, компілятор чи інтерпретатор їх вивів автоматично, полегшивши нам написання коду. Але не завжди це у нього буде вдаватись, і взагалі знати типи даних обовʼязково потрібно.
Статично типізований означає що перевірка типів відбувається на етапі компіляції, а не виконання. Строга типізація означає що не явного приведення типів не відбувається, можливо тільки явно вказувати приведення.
Щоб дізнатись тип функції чи оператора в інтерпретаторі
ghciпотрібно використати команду інтерпретатораtype. Всі команди інтерпретатора починаються з символу двокрапки. Виглядає це так:type x.let x = 10 :type xКоманди інтерпретатора можна скорочувати до першої літери, але тільки якщо не відбувається колізії. Тому
:typeі:tодне і теж.Ця команда поверне нам
x :: Num p => pУ цьому рядку оператор
::схожий на=, але працює з типами, а не значеннями. За допомогою нього ми зможемо самі вказувати типи. Зліва від нього знаходиться вираз, а з права його тип. Що означає права частина у цьому випадку ми розберемо згодом, а зараз подивимось на те як уточнювати тип самостійно.let x = 10 :: IntТут ми явно вказуємо тип за допомоги оператора типізації. Тепер команда типу
:t xповерне нам такеx :: Int.Є шість основних, фундаментальних типів.
- Bool - Логічний (True, False)
- Char - Символьний ('\0' - '\1114111')
- Int - Знаковий цілочисельний (-9223372036854775808 - 9223372036854775807)
- Integer - Знаковий цілочисельний без обмежень)
- Float - Знаковий дробовий
- Double - Знаковий дробовий з подвійною точністю
Перейдімо від констант до функцій. Для прикладу візьмемо стандартну функцію
not. Вона приймаєboolі повертає інвертоване значення типуbool.not True -- Поверне False not False -- Поверне TrueТепер розберемо його тип
:t not not :: Bool -> BoolУ цьому випадку функція приймає один аргумент і саме його тип вказаний перед стрілкою, а після неї тип повернення. Але якщо буде кілька вхідних аргументів, то вони всі будуть переліченні через стрілки.
Для прикладу візьмемо оператор
&&. Щоб подивитись тип оператора потрібно взяти його у душки:t (&&).(&&) :: Bool -> Bool -> BoolПерші два
Boolце вхідні аргументи, а останній тип повернення. Саме через такі типи працює часткове застосування функцій. Візьмем(&& True)і побачимо що тип його(&& True) :: Bool -> Bool. Розташування аргументу значення не має.#програмування #haskell #типи #типізація #статична #строга #фукції #оператори #інтерпретатор #ghci #команди #type #types #typing #static #константи
-
CW: Типи в :haskell:
Haskell є строго статично типізованою мовою програмування, але з можливістю автоматичного виведення типів. В усіх наших попередніх програмах ми ніде не вказували типи, компілятор чи інтерпретатор їх вивів автоматично, полегшивши нам написання коду. Але не завжди це у нього буде вдаватись, і взагалі знати типи даних обовʼязково потрібно.
Статично типізований означає що перевірка типів відбувається на етапі компіляції, а не виконання. Строга типізація означає що не явного приведення типів не відбувається, можливо тільки явно вказувати приведення.
Щоб дізнатись тип функції чи оператора в інтерпретаторі
ghciпотрібно використати команду інтерпретатораtype. Всі команди інтерпретатора починаються з символу двокрапки. Виглядає це так:type x.let x = 10 :type xКоманди інтерпретатора можна скорочувати до першої літери, але тільки якщо не відбувається колізії. Тому
:typeі:tодне і теж.Ця команда поверне нам
x :: Num p => pУ цьому рядку оператор
::схожий на=, але працює з типами, а не значеннями. За допомогою нього ми зможемо самі вказувати типи. Зліва від нього знаходиться вираз, а з права його тип. Що означає права частина у цьому випадку ми розберемо згодом, а зараз подивимось на те як уточнювати тип самостійно.let x = 10 :: IntТут ми явно вказуємо тип за допомоги оператора типізації. Тепер команда типу
:t xповерне нам такеx :: Int.Є шість основних, фундаментальних типів.
- Bool - Логічний (True, False)
- Char - Символьний ('\0' - '\1114111')
- Int - Знаковий цілочисельний (-9223372036854775808 - 9223372036854775807)
- Integer - Знаковий цілочисельний без обмежень)
- Float - Знаковий дробовий
- Double - Знаковий дробовий з подвійною точністю
Перейдімо від констант до функцій. Для прикладу візьмемо стандартну функцію
not. Вона приймаєboolі повертає інвертоване значення типуbool.not True -- Поверне False not False -- Поверне TrueТепер розберемо його тип
:t not not :: Bool -> BoolУ цьому випадку функція приймає один аргумент і саме його тип вказаний перед стрілкою, а після неї тип повернення. Але якщо буде кілька вхідних аргументів, то вони всі будуть переліченні через стрілки.
Для прикладу візьмемо оператор
&&. Щоб подивитись тип оператора потрібно взяти його у душки:t (&&).(&&) :: Bool -> Bool -> BoolПерші два
Boolце вхідні аргументи, а останній тип повернення. Саме через такі типи працює часткове застосування функцій. Візьмем(&& True)і побачимо що тип його(&& True) :: Bool -> Bool. Розташування аргументу значення не має.#програмування #haskell #типи #типізація #статична #строга #фукції #оператори #інтерпретатор #ghci #команди #type #types #typing #static #константи