Pull to refresh
2
0.9

Специалист по теории типов USB-кабелей

Send message

В коде ключевые слова 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 = ...

Как один из кучи вариантов.

isabelle/hol

Мне не зашло, но люди пользуются (а меня и от кока чё-т тошнит).

Да один фиг, даже обычное сожительство тоже переоценено.

На удалёнке от 10 до 30 тысяч долларов на руки, нафиг эти ваши офисы?

Функциональное программирование более гибкое, соглашусь. Податливо, как пластилин. Очень удобно для научных задачек и сольного программирования. НО ЗАВОДЫ ИЗ ПЛАСТИЛИНА НА СТРОЯТ.

Ага. Именно поэтому верифицированное ядро SeL4 в первую очередь сделано на хаскеле (с полуэкстракцией в C). Или поэтому смарт-контракты с требованиями доверия им делаются на хаскеле и верифицируются на коке/изабелле/етц.

Хаскель не предлагать как язык широкого применения не проходит

Почему не подходит? Вполне применяю его широко, от написания на нём компиляторов до перекладывающих жсоны опердней.

…которые в него вступили по причинам традиций, социального давления и так далее, не понимая, что лично им в нём будет хуже, чем описывается в дискурсе.

Или, более кратко, «брак переоценен».

На самом деле тут надо бы ещё как-то демонстрировать своё отношение к этим книгам, потому что прочитанный и стоящий на полочке Поппер или Фукуяма ничего не говорят о том, насколько вы с ними согласны.

А потом разбираться с партнером по теме, с чем ты «сексуально взаимодействуешь» больше с работой или с ним/ней/ними? 

Хоть одна девушка бы мне хоть раз такую претензию высказала бы, эх.

И почему это нельзя работать на буржуазию и одновременно обличать ее?

Можно, законы физики не запрещают. Но этически некрасиво.

Социальный фактор сильно ударил по мне сперва в 2020

Ой, а что случилось в 2020-м?

А то мне всё время говорили в ответ на то, что социальный фактор будет сильно бить, мол, ничё, нормально, можно в дискорде там голосом или вот вообще всем только лучше станет и спокойнее.

Я вообще не представляю как можно самореализовываться в профессии без возможности кому-то рассказать о своих достижениях. А кому это может быть понятно и интересно кроме коллег?

Пишите на хабр (или в блог, или тому подобное).

Рамки самовыражения на работе ограничены рабочими задачами и необходимостью нести за них ответственность и быть в контексте команды. Никто не оценит ваши глубокие познания матана, если он там не нужен, или темплейтов C++, если они там не нужны, или тому подобные вещи.

Хотя, возможно, для вас более ценна польза от решения рабочих задач, а не их сложность или мастерство в техническом стеке — говорят, большинство людей прётся от того, что (думает, что) помогает кому-то ещё.

Характерный по (дис)балансу пример: трейдинг-компания на примерно 70 человек. Из них женского пола трое: две эйчарши (одна возрастом лет 60, другая — лет 40, но давно и плотно замужем) и одна джунша на саппорте всяких скриптов (лет 20 и свободна, но, как бы помягче выразиться, как девушка не привлекает напрочь). Художниц нет, тестировщиц нет, hr — см. выше, офис-менеджеры что это такое вообще, программистка целая одна, тоже см. выше.

Да, есть и крупные компании, где есть кто-то из других отделов, но общего и тем для общения у них со мной как у посетительниц того же супермаркета.

Это просто зависит от книжки и от вас.

В 12 лет я мог читать книжку в метро (глаза не болели от мелкого трясущегося шрифта, книжки были попроще, вроде учебника C++, и концентрации хватало). В 22 я в метро книжки читать уже не мог (и глаза болели, и в поток, чтобы читать условную книгу или статью по матану, концентрации войти уже не хватает).

Что вам мешало свои условия улучшить?

Ничего не мешало: я перешёл на удалёнку и уехал туда, где этих (и многих других) проблем нет.

Начинают мешать фанаты офиса.

Ковидные года 2020-2021 стали рекордными по количеству разводов и бытовому насилию.

Надеюсь, этого заодно надолго хватит, чтобы понять, что брак несколько переоценен.

Information

Rating
2,004-th
Registered
Activity