Використовуєте систему "сильного" типу в реальному світі, скажімо, для масштабних веб-додатків?


29

Я знаю, що це дуже широке, неоднозначне і, можливо, філософське питання. В тій мірі, що найважливіше ключове слово у питанні - сама система "сильних" типів, є неправильною . Отже, дозвольте спробувати пояснити, що я маю на увазі.

Загальний контекст для питання

Ми будуємо дуже масштабний веб-додаток в Ruby on Rails, і ми загалом раді нашій стеці. Коли ми хочемо, ми можемо доставляти речі дуже швидко - те, що працює для 90% справи "бізнесу", не турбуючись надто про 10% випадків. З іншого боку, за допомогою перегляду коду та тестування ми можемо бути повільними та обдуманими та переконатися, що ми охоплюємо всі основи - знову ж таки, лише у ситуаціях, які заслуговують на такий пильний контроль та безпеку.

Однак, коли команда зростає, мені стало незручно через відсутність "сітки безпеки", яку випекли прямо в наш стек.

Нещодавно ми почали займатися розробкою Android на Java. І мені (приємно) нагадали про безпеку, що забезпечується складеною / статичною / сильно набраною мовою.

  • Неправильно написані змінні, неправильні типи даних, неправильні виклики функцій та безліч дрібницьких помилок виявляє сам ваш IDE. Все тому, що IDE може підключитися до компілятора і перевірити певні аспекти «правильності» програми.
  • Потрібно змінити підпис функції? Легко. Компілятор + IDE може допомогти вам знайти ВСІ сайти викликів.
  • Потрібно гарантувати, що певні винятки завжди обробляються? Перевірив винятки на вашу допомогу.

Зараз, хоча ці функції безпеки мають свої переваги, я добре знаю і їх недоліки. Тим більше, що у світі "котла важкої" Java. Тому замість Java я почав переглядати цілий ряд сучасних «сильно набраних» мов, якими люди почали працювати в ці дні. Наприклад: Scala, Rust, Haskell і т. Д. Найбільше мене цікавить сила систем їх типів і статичні перевірки / час збирання.

Тепер питання

Як я можу використовувати ці потужні системи типу та функції статичного / компіляційного часу у великих програмах?

Наприклад, як я міг би вийти за рамки стандартного вступу "привіт світ" до цих потужних функцій? Той, який використовує систему багатого типу для моделювання проблеми бізнес-домену? Чи допомагає система типу чи перешкоджає, коли ви знаходитесь у зоні 30000 LOC +? Що відбувається з мережею безпеки, що надається цими типами систем (і перевірки часу компіляції), коли ваша система взаємодіє зі слабким типом зовнішнього світу, наприклад. через API JSON або XML, різні сховища даних, введення користувачів тощо.


12
Це поза темою, оскільки немає реальної відповіді. Питання покликане викликати впевненість у дискусії ("мені подобаються / не подобаються статичні типи, тому що ..."), а не фактичне пояснення . Моя порада полягає в тому, щоб вибрати одну з більш конкретних частин вашого питання, наприклад "Що відбувається з мережею безпеки, що надається цими системами, коли ваша система взаємодіє зі слабким типом зовнішнього світу?" і перепишіть питання про це. Ви отримаєте остаточні відповіді, які будуть корисні таким майбутнім читачам.
Бенджамін Ходжсон

5
Рекомендації щодо ресурсів тут також поза темою (адже такі відповіді швидко застарівають, і ми насправді не є кращими за Google). Як сказав Бенджамін, у вашій публікації поховано кілька відповідальних питань, але весь пост у його нинішньому стані по суті просить людей описати свій досвід використання цих мов, що набагато краще підходить для Quora або Reddit, ніж це StackExchange сайт. Я не виступаю за те, що це питання добре задається, але це просто не питання StackExchange.
Іксрек

4
Система типу - це інструмент, і, як і будь-який інший інструмент, його ефективність багато в чому залежить не від самого інструменту, а від вальдера. Ви можете використовувати типову систему такої мови, як Haskell, для кодування інваріантів щодо вашої бізнес-логіки на рівні типу, а ті інваріанти перевіряються машиною (компілятором) під час компілятора, але для цього вам потрібно зрозуміти семантику система типу та перевірка типу. Правильне запитання не в тому, "чи це хороший інструмент для веб-матеріалів", це "ось деякі конкретні проблеми, з якими я стикаюся; як можна використовувати для їх вирішення сильну систему типу?"
user2407038

5
Більшість описаних вами речей не мають нічого спільного з типовою системою. Вони суто особливості IDE. За винятком (не призначений каламбур) перевірених винятків, всі функції, про які ви згадуєте, були наявними в IDE Smalltalk задовго до їх появи в IDE для статично набраних мов. Насправді один з найбільш широко використовуваних Java IDE насправді почався як модифікований IDE Smalltalk (IBM VisualAge Smalltalk, який був модифікований для розуміння коду Java, але все ще був написаний в Smalltalk і випущений як VisualAge Java, який потім переносився на Java та звільнений як…
Jörg W Mittag

4
… VisualAge Java Micro Edition, який потім був розбитий на повторно використовувані компоненти та випущений як Open Source під назвою Eclipse). Дещо іронічно в контексті цього питання, саме через динамічний характер систем Smalltalk IDE Smalltalk настільки потужні. Автоматизовані реконструктори були винайдені та вперше впроваджені, наприклад, у Smalltalk. За вашою логікою, Haskell повинен мати найкращі IDE, оскільки він має найсильнішу, найсуворішу систему статичного типу з усіх згаданих вами мов. Але це не так. Ви також згадали про "підключення до компілятора". Це…
Jörg W Mittag

Відповіді:


34

Я дам коротку відповідь через брак часу на даний момент, але наразі я працюю над двома великими проектами (> 100 000 LOC в Haskell) - flowbox.io та luna-lang.org. Ми використовуємо Haskell для всіх частин, включаючи бекенд, компілятор нашої мови програмування і навіть графічний інтерфейс на базі webGL. Я маю визнати, що система сильного типу та техніка, що нагадує "залежний тип", можуть керувати вами та врятувати вас від тягаря та клопоту, відомих з інших мов. Ми використовуємо типи дуже широко, і все, що можна було перевірити за час компіляції, робиться так. Насправді, протягом останніх 3 років розвитку ми ніколи не стикалися з помилками виконання або переповненням стека (і це щось справді неймовірне). Єдині помилки - це очевидні логічні помилки, допущені програмістами. Дуже багато людей говорять, що якщо щось складеться в Haskell, це просто працює, і ви повинні бути впевнені, що він не дме в обличчя якогось дня.

Відповідаючи на першу частину питання: Ви можете дізнатися про ці потужні функції системи, читаючи кілька чудових блогів, наприклад:

Насправді, існує багато інших приємних блогів (наприклад, планета Хаскелл ). У будь-якому випадку, найкращий спосіб реально зрозуміти системи сучасного типу - це розробити корисну бібліотеку з відкритим кодом. Ми (у Flowbox & New Byte Order) випускаємо багато бібліотек (їх можна знайти в Hackage), тому, якщо ви не маєте ідеї, що розвивати, ви завжди можете залучити до наших проектів - просто напишіть мені щоразу, коли ви хочу (пошта доступна на luna-lang.org ).


4
"Дуже багато людей говорять, що якщо щось збирається в Haskell, це просто працює, і ви повинні бути впевнені, що він не зіб'є вам в обличчя якийсь день.": Я використовував Haskell лише для невеликих (хоча і нетривіальних) проектів , але я можу підтвердити це: Після того, як компілятор Haskell задоволений, я рідко знаходжу помилок.
Джорджіо

1
Я, напевно, один із хлопців "Haskell", котрий найбільше ненавидить типи (настільки, я написав власну версію Haskell без типів , зрештою) - але з різних причин це робить більшість людей. Що стосується інженерії програмного забезпечення, я теж маю таке відчуття, що, коли GHC задоволений, ваша програма просто працює. Системи типу Haskell - це найкращий інструмент не лише для виявлення гуманістичних помилок у програмуванні, але і для зберігання величезних баз коду під вашим контролем. (Я завжди пам’ятаю виправдання Джованні для панцирів Мевтва, коли мені доводиться виправляти помилки типу.)
MaiaVictor

Блог Габріеля Гонзалеса - найкращий для початку.
sam boosalis

@ danilo2 Надіслали електронний лист на адресу contact @ на веб-сайті вашої компанії. Попросити відповісти. Спасибі!
Саураб Нанда

@SaurabhNanda: Я двічі перевірив нашу поштову скриньку і не бачу жодного повідомлення від вас. Ви надіслали його на контакт <at> luna-lang.org? Будь ласка, зв'яжіться зі мною безпосередньо, пишучи моєму wojciech <dot> danilo <at> gmail <dot> com, і ми
дослідимо,

17

Ну, слабке та сильне введення тексту досить невиразно визначено. Крім того, оскільки найбільш близьким до загального використання "сильного набору тексту" є посилання на речі, які ускладнюють виведення типів, що не залишає нічого більше для опису ще сильніших типів систем. Це як сказати, що якщо ти можеш носити менше 30 фунтів, ти слабкий, і кожен, хто може підняти більше, перебуває в одній категорії «сильних» - оманливе відмінність.

Тому я віддаю перевагу визначенню:

  • Слабо типізовані системи використовують типи, щоб запобігти вам робити певні речі (наприклад, помилки)
  • Сильно типізовані системи використовують типи, щоб робити речі для вас

Що я маю на увазі під те, що роблю для вас речі? Що ж, давайте вивчимо написання API перетворення зображень у рамках Служби (в Haskell, але вам не потрібно знати, щоб це слідкувати далі, ви побачите ...)

{-# LANGUAGE
    TypeOperators,
    DataKinds
    #-}

import Codec.Picture
import Data.Proxy
import Network.Wai.Handler.Warp (run)
import Servant
import Servant.JuicyPixels

main :: IO ()
main = run 8001 conversion

Це говорить про те, що ми хочемо, щоб деякі модулі, включаючи пакет Servant і плагін JuicyPixels для Servant, і що головна точка входу програми - запустити функцію 'перетворення' на порт 8001 як сервер, що використовує сервер Backp. Ігноруйте мову трохи.

conversion :: Application
conversion = serve (Proxy :: Proxy ConversionApi) handler

Це говорить про те, що функція перетворення - це сервер, на якому API повинен відповідати типу "ConversionApi", а запити обробляються функцією handler

type ConversionApi
     = ReqBody '[BMP, GIF, JPEG 50, PNG, TIFF, RADIANCE] DynamicImage
    :> Post '[BMP, GIF, JPEG 50, PNG, TIFF, RADIANCE] DynamicImage

Це вказує ConvesionApiтип. У ньому йдеться про те, що ми повинні приймати типи вхідного вмісту, визначені у списку '[BMP, GIF, JPEG 50, PNG, TIFF, RADIANCE], і обробляти їх як DynamicImage, і що ми повинні повертати DynamicImage, перетворений у той самий діапазон вмісту типи. Не хвилюйтесь точно про те, що:> означає, просто подумайте про це як про щасливу магію.

Отже, враховуючи моє вподобане визначення, система із слабким типом може тепер забезпечити такі речі, як:

  • Ви не повертаєте неправильний тип вмісту вихідного вмісту
  • Ви не розбираєте вхідний запит як неправильний тип вмісту
  • Якщо наш сервер був складнішим, це не дозволило б нам створити неправильно сформовані URI, але ми фактично не повертаємо жодних HTML-сторінок, які містять посилання (а тип гарантує, що ми не можемо!)
  • Дійсно амбіційна система слабкого набору тексту може навіть перевірити, щоб переконатися, що ми вичерпно обробляємо всі типи вмісту вхідного та вихідного вмісту, дозволяючи типу також діяти як специфікаційний документ, а не лише обмеження.

Всі високі цілі, але насправді недостатньо, щоб кваліфікуватись як сильно набрана система, враховуючи вищеописане визначення. А тепер нам належить перейти до важкої частини фактично написаного коду, що відповідає цій специфікації. У дійсно сильній системі типу ми пишемо:

handler = return

І тоді ми закінчили. Ось так, більше не можна писати код . Це повністю функціонуючий веб-сервер (модуль будь-яких помилок друку я пропустив). Тип повідомив компілятору все необхідне для створення нашого веб-сервера з тих типів та пакетів (модулів технічно), які ми визначили та імпортували.

Отже, як ви навчитеся робити це за великою шкалою додатків? Ну, це насправді мало чим відрізняється від використання їх у менших масштабах. Абсолютні типи не байдуже, скільки написано коду щодо них.

Перевірка типу часу роботи - це те, чого ви, мабуть, хочете уникнути, тому що це позбавляє величезної кількості переваг і дозволяє типам зробити ваш проект складнішим, ніж замість того, щоб типи спрощували речі.

Здебільшого, це лише питання практики моделювання речей із типами. Два основні способи моделювання речей (або побудови речей взагалі) - це знизу вгору та зверху вниз. Зверху вниз починається з найвищого рівня операцій, і коли ви будуєте модель, у вас є частини, де ви відкладаєте моделювання на потім. Моделювання знизу означає, що ви починаєте з базових операцій, як і ви починаєте з базових функцій, потім будуєте більш великі та великі моделі, поки не повністю захопите роботу проекту. Знизу вгору конкретніше і швидше побудувати, але зверху вниз може краще повідомити ваші моделі нижчого рівня про те, як їм потрібно насправді вести себе.

Типи - це те, як програми ставляться до математики, буквально, тому насправді немає верхньої межі того, наскільки вони можуть бути складнішими, або точки, коли можна дізнатися про них. Практично всі ресурси поза університетськими курсами вищого рівня присвячені тому, як типи працюють на певній мові, тому вам також потрібно вирішити це.

Як найкраще я можу запропонувати, типи можна розшаровувати так:

  • Дуже слабко введені такі речі, як JavaScript, де визначено [] + {}
  • Слабо набрано, як Python, де ви не можете зробити [] + {}, але це не перевірено, поки ви не спробуєте
  • Слабо набрано типу C або Java, де ви не можете зробити [] + {}, але це перевірено під час компіляції, однак у вас немає більш вдосконалених функцій типу
  • Розмикання межі між слабо і сильно набраними, такими як метапрограмування шаблонів C ++, і більш простим кодом Haskell, коли типи лише застосовують властивості.
  • Повністю введені, як більш складні програми Haskell, де типи роблять речі, як показано вище
  • Дуже сильно типізований, як Агда або Ідріс, де типи та значення взаємодіють і можуть обмежувати одне одного. Це так сильно, як отримують типові системи, а програмування в них - це те саме, що писати математичні докази того, що робить ваша програма. Примітка: кодування в Агді - це не буквальне написання математичних доказів, типи - це математичні теорії, а функції з цими типами - конструктивні приклади, що підтверджують ці теорії.

Як правило, чим далі ви переходите до цього списку, тим більше, що типи можуть зробити для вас, але вже в самому дні ви забираєтесь у стратосферу, і повітря стає дещо тонкішим - екосистема пакету набагато менша, і ви ' Вам доведеться писати більше речей самостійно, знайшовши відповідну бібліотеку. Перешкода для входу також стає вище, коли ви спускаєтесь, оскільки вам потрібно насправді зрозуміти систему типів, достатню для написання масштабних програм.


Зауважте, що вам не потрібно префіксувати список на рівні типу з апострофом, якщо в списку є більше елемента. Апостроф необхідний лише для 0- або 1-елементних списків типів, оскільки вони неоднозначні (вони можуть посилатися на звичайний конструктор типів списку)
Габріель Гонсалес

1
Я знаю, але я мав враження, що апостроф був просто гарною формою для рекламованих типів даних загалом. EG, яка Proxy :: Proxy Trueпрацює, але краще записати її як Proxy :: Proxy 'True.
Стівен Армстронг

1
Здається, краще не зруйнувати різні осі, відповідно до яких типів можна класифікувати. Лямбда-куб Барендрегта вже включає три, а крім того, по одній осі слабкої сильної сили ви також включаєте статичний проти динамічний та параметричний порівняльний поліморфізм (останній - це те, що дозволяє службовій техніці виготовлення типів робити більшу частину роботи ').
користувач2141650

1
Справедливий момент, але відповідь вже дуже довгий, і ви повинні бути на шляху до вивчення теорії типів, перш ніж лямбда-куб дійсно почне мати сенс. Крім того, за межами дуже ніші (а оскільки я вже включаю Haskell і навіть Agda, я справді маю на увазі цілком нішеві) мови, ви насправді не збираєтесь знайти мову, яка має, наприклад, залежні типи, але немає операторів типу .
Стівен Армстронг

Чи можете ви коротко пояснити '[xs]синтаксис? Це явно не є Char, але я не бачу, як TypeOperatorsабо DataKindsвмикає альтернативний синтаксис. Це якесь квазіцитування?
wchargin

10

Я тільки почав працювати над основною командою великої платформи, написаної на Scala. Ви можете подивитися на успішні програми з відкритим кодом, такі як Scalatra, Play або Slick, щоб побачити, як вони обробляють деякі ваші більш детальні запитання щодо взаємодії з динамічними форматами даних.

Однією з найважливіших переваг, яку ми знайшли у зв'язку із сильним набором тексту Scala, є навчання користувачів. Основна команда може приймати рішення та виконувати ці рішення в системі типів, тому коли інші команди, які набагато менш знайомі з принципами проектування, повинні взаємодіяти з системою, компілятор виправляє їх, а основна команда не постійно виправляє речі в тягнути запити. Це величезна перевага у великій системі.

Звичайно, не всі принципи проектування можуть бути застосовані в системі типів, але чим сильніше ваша система, тим більше принципів проектування можна застосувати в компіляторі.

Ми також можемо полегшити роботу користувачам. Часто для них вони просто працюють із звичайними колекціями або кейсами, і ми перетворюємо їх на JSON або що інше автоматично, як потрібно для мережевого транспорту.

Сильне введення тексту також допомагає зробити розмежування між такими речами, як несанітоване та санітарне введення, що може допомогти у безпеці.

Сильне введення тексту також допомагає вашим тестам бути більш зосередженими на власній поведінці , замість того, щоб потребувати купу тестів, які просто перевіряють ваші типи. Це робить тестування набагато приємнішим, більш зосередженим і, отже, більш ефективним.

Основним недоліком є ​​незнайомість мови та мовної парадигми, і це можна виправити з часом. Крім того, ми вважаємо, що це варто вартих зусиль.


8

Хоча це не пряма відповідь (оскільки я ще не працював над +30.000 базами кодів LOC в haskell :( ..), я благаю вас перевірити https://www.fpcomplete.com/business/resources/case-studies /, в якому представлено багато практичних прикладів haskell у фактичних галузевих умовах.

Ще одна добра стаття - IMVU, в якій описується їхній досвід переходу на haskell - http://engineering.imvu.com/2014/03/24/what-its-like-to-use-haskell/ .

З особистого досвіду у великих програмах, типова система дуже допомагає вам, особливо якщо ви намагаєтеся кодувати максимально багато типів. Справжня сила справді очевидна, коли мова йде про реконструкцію речей - це означає технічне обслуговування і таке стає набагато менш тривожним завданням.

Я зірву пару посилань на ресурси, які я рекомендую, оскільки ви задаєте відразу багато питань:

Як заключне зауваження, стосунки із зовнішнім світом робляться кількома способами. Існують бібліотеки, щоб переконатися, що речі на вашому кінці безпечні для типу, як Aeson для JSON, Esqueleto для SQL та багато іншого.


1
дякую за відповідь, однак тематичні дослідження на сайті fpcomplete.com/business/resources/case-studies більше не доступні.
Саураб Нанда

Схоже, тематичні дослідження перенеслись на fpcomplete.com/case-study
Стівен Шов

3

Що я бачив:

Я працював декількома великими веб-програмами Ruby (Rails), одним великим веб-додатком Haskell та кількома меншими. Маючи цей досвід, я мушу сказати, що життя над програмами Haskell набагато простіше, ніж у Rails, у таких аспектах, як підтримка та менша крива навчання. Я вважаю, що ці переваги зумовлені типовою системою Haskell і функціональним стилем програмування. Однак, на відміну від багатьох, я вважаю, що "статична" частина системи типу - це просто величезна зручність в тому, що все-таки вигода має бути використана при використанні динамічних контрактів.

У що я вірю

Існує приємний пакет під назвою Contracts Ruby, який іде в ході надання деяких основних функцій, які, на мою думку, допомагають проектам Haskell досягти кращих технічних характеристик обслуговування. Контракти Ruby виконує свої перевірки під час виконання, тому найкраще, коли він поєднується з високою тестовою конвергенцією, але все ще надає таку ж лінійну документацію та вираження намірів та сенсу, як і використання анотацій типу на таких мовах, як Haskell.

Відповідь на питання

Щоб відповісти на поставлені вище запитання, існує багато місць, де можна ознайомитись з Haskell та іншими мовами із системами прогресивного типу. Однак, і чесно кажучи, хоча ці джерела документування самі по собі є чудовими, вони, здається, трохи недостатні в порівнянні з безліччю документації та практичних порад, знайдених у Ruby, Python, Java та інших подібних мовах. У будь-якому випадку, Real World Haskell старіє, але все ще є хорошим ресурсом.

Теорія категорій

Якщо ви виберете Haskell, ви зіткнетесь з великою кількістю літератури, що обговорює теорію категорій. Теорія категорій ІМХО корисна, але не потрібна. Зважаючи на його поширеність у громаді Хаскелла, можна легко поєднати плюси та мінуси типів з почуттями щодо практичності теорії категорій. Корисно пам’ятати, що це дві різні речі, тобто, що реалізація, керована теорією категорій, може бути виконана як в динамічно набраних мовах так само, як і статичних (за модулем переваги, що надає система типів). Системи сучасного типу загалом не пов'язані з теорією категорій, а теорія категорій не пов'язана з системами типів.

Детальніше про типи

Коли ви дізнаєтесь більше про програмування з типами та технікою в них (що відбувається досить швидко, тому що це цікаво), ви хочете більше висловитись із системою типів. У такому випадку я б звернувся до деяких із наведених нижче ресурсів і приєднався до мене, щоб повідомити продавців інструментів про те, що ми хочемо, щоб інструменти промислової якості з цими функціями були вкладені лише в те, що відкриває простий у користуванні інтерфейс (наприклад, Contract Ruby):


2

По-перше, я відчуваю, що виникає плутанина у відповідях між слабо типізованими проти сильно набраними та статичними проти динамічно набраними. Посилання на надану ОП чітко відрізняє:

Система сильного типу - це система типу, яка має обмеження часу компіляції або час виконання, яке вам здається привабливим.

Система слабкого типу - це система типу, якій не вистачає цього обмеження чи функції.

Наприклад, C, C ++ та Java статично набираються, оскільки змінні вводяться під час компіляції. Тим не менш, C і C ++ можна вважати слабко набраними, оскільки мова дозволяє обійти обмеження за допомогою void *покажчиків і кастів. Детальніше на цю тему.

За цим розрізненням сильне введення тексту може бути лише кращим. Чим раніше провал, тим краще.

Однак, пишучи великі програми, я не думаю, що система типу відіграє важливу роль. Ядро Linux - це десять мільйонів LOC, написане на C та збірці, і воно вважається дуже стабільною програмою, воно знаходиться в милях від моїх 200 ліній Java, які, ймовірно, повні пробіли в безпеці. Аналогічно, хоча динамічно набрані "мови скриптів" страждають поганою репутацією, коли мова йде про написання великих програм, періодично є докази, що це незаслужено (наприклад, Python Django, понад 70 тис. LOC)

На мою думку, це все стосується стандарту якості. Відповідальність за масштабованість великих додатків повинні нести лише програмісти та архітектори, а їхня воля - зробити додаток чистим, перевіреним, добре задокументованим тощо.


-1

Де можна прочитати про те, як використовувати ці потужні системи типу та статичні / функції компіляції у великих програмах?

з попередньої відповіді https://www.fpcomplete.com/business/resources/case-studies/

Як можна вийти за межі стандартного «привітного світу» ознайомлення з цими потужними характеристиками?

це справді як і будь-яка інша мова, щоб набрати силу

Як можна використовувати систему багатого типу для моделювання проблеми бізнес-домену?

Використовуючи абстрактні типи даних, або загалом поліморфізм

Чи допомагає система типу чи перешкоджає, коли ви знаходитесь у зоні 30000 LOC +?

Це допомагає на всьому шляху. система типу допоможе вам написати код, оскільки він повідомляє вам форму результату, який ви хочете мати. Насправді Агда написати код для вас.

PS: не робіть помилки, коли ви маєте систему типів та самі повинні писати типи, що ідіотично: комп'ютер може це зробити за вас.

Що відбувається з мережею безпеки, що надається цими типами систем (і перевірки часу компіляції), коли ваша система взаємодіє зі слабким типом зовнішнього світу, наприклад. через API JSON або XML, різні сховища даних, введення користувачів тощо.

Це чудово, оскільки знання структури значень за допомогою типів означає, що комп'ютер може зробити спосіб написання (де) серіалізатора для вас.

Якщо ви дійсно хочете дізнатися про типи та абстрагування, найкраще введення - Про розуміння типів, абстрагування даних та поліморфізм

Це папір, а не тематичне дослідження з гарними картинками, але це освічуюче


-2

Як програміст .net, який багато працює над веб-додатками, я бачу як набрану C #, так і нетипізовану сторону JavaScript.

Я не впевнений, що я бачив будь-яку літературу щодо питань, які ви задаєте. Маючи набрану мову, ви приймаєте всі ці речі як належні. З типовим типом ви бачите визначення типів як непотрібні накладні витрати.

Особисто я не думаю, що ви можете заперечувати, що сильно набрана мова пропонує переваги, які ви описуєте, за дуже низькою ціною (порівняно з написанням еквівалентних одиничних тестів). Взаємодія зі слабко типізованими системами зазвичай включає загальні типи, такі як масиви або словники об'єктів, такі як DataReader, або творче використання рядків або нового динамічного класу. По суті це все працює, ви просто отримуєте помилку виконання замість часу компіляції.

Якщо ви хочете написати дуже коротку програму, можливо, визначивши функцію в декількох рядках для роботи з більшим додатком, тоді вам просто немає місця для оголошення класів. Напевно, це ніша нетипізованих мов, таких як JS?


Ви маєте на увазі набраний / нетипізований або статично набраний / динамічно набраний? JavaScript не вводиться, а динамічно набирається.
Джорджіо

2
не потрібно визначати типи. будь-яка гідна мова підводить для вас типи: haskell, ocaml, sml, F # ...
nicolas

1
коли ви звикли до сильно набраної мови, все інше не типізоване, коли я кажу, що визначають типи, які я маю на увазі "створити класи", переконайтеся, що ви можете використовувати var чи що завгодно, але це лише хитрість компілятора
Ewan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.