В коде ключевые слова class, instance... Ну допустим это другое.
Это действительно другое.
class — это обобщение ООПных интерфейсов или плюсовых концептов. Концепт «итератор» был бы классом. «Моноид» на самом деле является классом. «Любая монада, поддерживающая возможность хранить стейт типа Foo», является классом.
Инстанс — это объявление, что данный тип соответствует данному интерфейсу/концепту, и реализация требуемых интерфейсом/концептов методов/типов.
Часть — код редактора (который определяет тайпкласс Tool,и непоказанная часть по использованию, потому что грузить экзистенциалами читателя не стоит). Часть — код клиентов (определяющих конкретные тулы, это каждая пара data/instance).
Соседние ораторы показали много разных сложных примеров, а я покажу рабоче-колхозно:
type EncodeResult = Either Error BitStream
type Encoder = VideoFrame → IO EncodeResult
-- создаёт энкодер, загружая libvpx и потенциально фейлясь
vp9swEncoder :: IO (Maybe Encoder)
vp9swEncoder = undefined
-- ну дрова уж точно могут зафейлиться при инициализации
vp9hwEncoder :: IO (Maybe Encoder)
vp9hwEncoder = undefined
data FallbackState = CanUseHW | ShouldFallback
swFallbackEncoder :: Encoder → Encoder → IO Encoder
swFallbackEncoder hwEncoder swEncoder = do
isFallback ← newIORef CanUseHW
pure $ \frame → readIORef isFallback >>= \case
ShouldFallback → swEncoder frame
CanUseHW → hwEncoder frame >>= \case
Right bs → pure $ Right bs
Left _ → writeIORef isFallback ShouldFallback >> swEncoder frame
Дальше это можно обмазать типами, чтобы swFallbackEncoder можно было создать только из пары SW и HW-энкодеров, но это предлагается читателю в качестве упражнения.
И в ООП вы или создаете VP8SWEncoder или H265HWEncoder или SoftwareFallbackEncoder(VP9SWEncoder, VP9HWEncoder). А потом просто вызвыаете Encode() у инстанса не думая о том, какой зоопарк кодеков у вас на самом деле.
А в чём вопрос? Просто возвращаете функцию.
mkEncoder :: String → IO (Maybe Encoder)
mkEncoder "vp9" = do
vp9swResult ← vp9swEncoder
vp9hwResult ← vp9hwEncoder
case (vp9hwResult, vp9swResult) of
(Just vp9hw, Just vp9sw) → pure <$> swFallbackEncoder vp9hw vp9sw
(_, _) → pure $ msum [vp9hwResult, vp9swResult]
mkEncoder "vp9:force-sw" = vp9swEncoder
mkEncoder "vp8" = vp8swEncoder
mkEncoder "h265" = h265hwEncoder
mkEncoder _ = pure Nothing
Если бы меня кто-то спрашивал, я бы сказал, что преимущества ООП раскрываются в предметных областях, которые хорошо матчатся на объектную модель (жира, например, как программный продукт: таска, проект, исполнитель, то-сё).
Звучит снова как ФП.
Я читал Domain Modeling Made Functional, и читал более классическую книгу Эванса. Если в первой всё было просто и понятно, хоть сейчас устраивайся в кровавый тырпрайз, то после второй я, по-моему, стал понимать даже меньше.
class Tool t m where
processPick :: t → Ctx → Point → m ()
handleSelection :: t → [Object] → m ()
data BackdoorCCP = BackdoorCCP
{ address :: String
, port :: Int
}
instance Tool BackdoorSendToCCPServers IO where
processPick bd _ p = sendToCCP bd $ "User clicked at " <> p
handleSelection = ...
data FilterClicks base = FilterClicks
{ filterPred :: Ctx → Point → Bool
, baseTool :: base
}
instance Tool t m => Tool (FilterClicks t) m where
processPick FilterClicks{..} ctx p
| filterPred ctx p = processPick baseTool ctx p
| otherwise = pure ()
handleSelection = ...
data TestSpy = TestSpy
instance Tool TestSpy (WriterT [(Point)] m) where
processPick _ _ p = tell [p]
handleSelection = ...
Функциональное программирование более гибкое, соглашусь. Податливо, как пластилин. Очень удобно для научных задачек и сольного программирования. НО ЗАВОДЫ ИЗ ПЛАСТИЛИНА НА СТРОЯТ.
Ага. Именно поэтому верифицированное ядро SeL4 в первую очередь сделано на хаскеле (с полуэкстракцией в C). Или поэтому смарт-контракты с требованиями доверия им делаются на хаскеле и верифицируются на коке/изабелле/етц.
…которые в него вступили по причинам традиций, социального давления и так далее, не понимая, что лично им в нём будет хуже, чем описывается в дискурсе.
На самом деле тут надо бы ещё как-то демонстрировать своё отношение к этим книгам, потому что прочитанный и стоящий на полочке Поппер или Фукуяма ничего не говорят о том, насколько вы с ними согласны.
Социальный фактор сильно ударил по мне сперва в 2020
Ой, а что случилось в 2020-м?
А то мне всё время говорили в ответ на то, что социальный фактор будет сильно бить, мол, ничё, нормально, можно в дискорде там голосом или вот вообще всем только лучше станет и спокойнее.
Я вообще не представляю как можно самореализовываться в профессии без возможности кому-то рассказать о своих достижениях. А кому это может быть понятно и интересно кроме коллег?
Пишите на хабр (или в блог, или тому подобное).
Рамки самовыражения на работе ограничены рабочими задачами и необходимостью нести за них ответственность и быть в контексте команды. Никто не оценит ваши глубокие познания матана, если он там не нужен, или темплейтов C++, если они там не нужны, или тому подобные вещи.
Хотя, возможно, для вас более ценна польза от решения рабочих задач, а не их сложность или мастерство в техническом стеке — говорят, большинство людей прётся от того, что (думает, что) помогает кому-то ещё.
Характерный по (дис)балансу пример: трейдинг-компания на примерно 70 человек. Из них женского пола трое: две эйчарши (одна возрастом лет 60, другая — лет 40, но давно и плотно замужем) и одна джунша на саппорте всяких скриптов (лет 20 и свободна, но, как бы помягче выразиться, как девушка не привлекает напрочь). Художниц нет, тестировщиц нет, hr — см. выше, офис-менеджеры что это такое вообще, программистка целая одна, тоже см. выше.
Да, есть и крупные компании, где есть кто-то из других отделов, но общего и тем для общения у них со мной как у посетительниц того же супермаркета.
В 12 лет я мог читать книжку в метро (глаза не болели от мелкого трясущегося шрифта, книжки были попроще, вроде учебника C++, и концентрации хватало). В 22 я в метро книжки читать уже не мог (и глаза болели, и в поток, чтобы читать условную книгу или статью по матану, концентрации войти уже не хватает).
Это действительно другое.
class— это обобщение ООПных интерфейсов или плюсовых концептов. Концепт «итератор» был бы классом. «Моноид» на самом деле является классом. «Любая монада, поддерживающая возможность хранить стейт типаFoo», является классом.Инстанс — это объявление, что данный тип соответствует данному интерфейсу/концепту, и реализация требуемых интерфейсом/концептов методов/типов.
Часть — код редактора (который определяет тайпкласс
Tool,и непоказанная часть по использованию, потому что грузить экзистенциалами читателя не стоит). Часть — код клиентов (определяющих конкретные тулы, это каждая параdata/instance).Соседние ораторы показали много разных сложных примеров, а я покажу рабоче-колхозно:
Дальше это можно обмазать типами, чтобы
swFallbackEncoderможно было создать только из пары SW и HW-энкодеров, но это предлагается читателю в качестве упражнения.А в чём вопрос? Просто возвращаете функцию.
Звучит снова как ФП.
Я читал Domain Modeling Made Functional, и читал более классическую книгу Эванса. Если в первой всё было просто и понятно, хоть сейчас устраивайся в кровавый тырпрайз, то после второй я, по-моему, стал понимать даже меньше.
Как один из кучи вариантов.
isabelle/hol
Мне не зашло, но люди пользуются (а меня и от кока чё-т тошнит).
Да один фиг, даже обычное сожительство тоже переоценено.
На удалёнке от 10 до 30 тысяч долларов на руки, нафиг эти ваши офисы?
Ага. Именно поэтому верифицированное ядро SeL4 в первую очередь сделано на хаскеле (с полуэкстракцией в C). Или поэтому смарт-контракты с требованиями доверия им делаются на хаскеле и верифицируются на коке/изабелле/етц.
Почему не подходит? Вполне применяю его широко, от написания на нём компиляторов до перекладывающих жсоны опердней.
…которые в него вступили по причинам традиций, социального давления и так далее, не понимая, что лично им в нём будет хуже, чем описывается в дискурсе.
Или, более кратко, «брак переоценен».
На самом деле тут надо бы ещё как-то демонстрировать своё отношение к этим книгам, потому что прочитанный и стоящий на полочке Поппер или Фукуяма ничего не говорят о том, насколько вы с ними согласны.
Хоть одна девушка бы мне хоть раз такую претензию высказала бы, эх.
Можно, законы физики не запрещают. Но этически некрасиво.
Ой, а что случилось в 2020-м?
А то мне всё время говорили в ответ на то, что социальный фактор будет сильно бить, мол, ничё, нормально, можно в дискорде там голосом или вот вообще всем только лучше станет и спокойнее.
Пишите на хабр (или в блог, или тому подобное).
Рамки самовыражения на работе ограничены рабочими задачами и необходимостью нести за них ответственность и быть в контексте команды. Никто не оценит ваши глубокие познания матана, если он там не нужен, или темплейтов C++, если они там не нужны, или тому подобные вещи.
Хотя, возможно, для вас более ценна польза от решения рабочих задач, а не их сложность или мастерство в техническом стеке — говорят, большинство людей прётся от того, что (думает, что) помогает кому-то ещё.
Характерный по (дис)балансу пример: трейдинг-компания на примерно 70 человек. Из них женского пола трое: две эйчарши (одна возрастом лет 60, другая — лет 40, но давно и плотно замужем) и одна джунша на саппорте всяких скриптов (лет 20 и свободна, но, как бы помягче выразиться, как девушка не привлекает напрочь). Художниц нет, тестировщиц нет, hr — см. выше, офис-менеджеры что это такое вообще, программистка целая одна, тоже см. выше.
Да, есть и крупные компании, где есть кто-то из других отделов, но общего и тем для общения у них со мной как у посетительниц того же супермаркета.
Это просто зависит от книжки и от вас.
В 12 лет я мог читать книжку в метро (глаза не болели от мелкого трясущегося шрифта, книжки были попроще, вроде учебника C++, и концентрации хватало). В 22 я в метро книжки читать уже не мог (и глаза болели, и в поток, чтобы читать условную книгу или статью по матану, концентрации войти уже не хватает).
Ничего не мешало: я перешёл на удалёнку и уехал туда, где этих (и многих других) проблем нет.
Начинают мешать фанаты офиса.
Надеюсь, этого заодно надолго хватит, чтобы понять, что брак несколько переоценен.