현재 Hackers' Pub은 Fresh 2.0 알파 버전을 사용하고 있는데, Fresh 자체의 한계점도 많이 느꼈고 무엇보다 최근 몇 달 사이에 정식 릴리스를 향한 진전이 보이지 않기에 GraphQL 준비가 끝나면 프런트엔드를 SolidStart로 점진적으로 옮겨가고자 한다.
洪 民憙 (Hong Minhee)
@hongminhee@hackers.pub · 959 following · 674 followers
Hi, I'm who's behind Fedify, Hollo, BotKit, and this website, Hackers' Pub! My main account is at
@hongminhee洪 民憙 (Hong Minhee)
.
Fedify, Hollo, BotKit, 그리고 보고 계신 이 사이트 Hackers' Pub을 만들고 있습니다. 제 메인 계정은:
@hongminhee洪 民憙 (Hong Minhee)
.
Fedify、Hollo、BotKit、そしてこのサイト、Hackers' Pubを作っています。私のメインアカウントは「
@hongminhee洪 民憙 (Hong Minhee)
」に。
Website
- hongminhee.org
GitHub
- @dahlia
Hollo
- @hongminhee@hollo.social
DEV
- @hongminhee
velog
- @hongminhee
Qiita
- @hongminhee
Zenn
- @hongminhee
Matrix
- @hongminhee:matrix.org
X
- @hongminhee
딱 ORM은 아니지만, 목적은 같은 하스켈의 opaleye 가 있습니다. 쿼리에 타입을 도입한 모양이라, 쿼리 검사에 타입 체커의 도움을 받을 수 있습니다. 처음 봤을 때, 함수형 방식으로 ORM 같은 걸 만든다면, 이렇게 되는 구나 감탄했는데, 익히는 비용이 만만치 않은 것 같습니다.
@hongminhee洪 民憙 (Hong Minhee)
@lionhairdino 저는 차라리 Rust의 sqlx처럼 Template Haskell 활용해서 SQL을 그대로 쓸 수 있게 해줬으면 더 좋았을 것 같네요… 🤔
Hackers' PubにLLMを活用した記事の自動翻訳機能が追加されました。これにより、Hackers' Pubに投稿された英語や韓国語の記事を日本語で閲覧できるだけでなく、日本語で書いた記事を海外の読者に紹介する事も可能に成りました。
なお、Hackers' Pubは招待制で運営されています。ご興味のある方は、DMでメールアドレスを教えていただければ、招待いたします。
Hackers' Pub 업데이트: LLM 기반의 게시글 번역 기능
洪 民憙 (Hong Minhee) @hongminhee@hackers.pub
LLM 기반의 게시글 번역 기능이 추가되었습니다. 우선, 자신이 쓴 게시글이 LLM을 이용해 번역되는 것을 허용하려면, 게시글 공개 설정에서 “LLM 기반 자동 번역 허용” 옵션을 켜 주셔야 합니다. 기존 게시글은 모두 이 옵션이 꺼져 있습니다만, 새로 쓰는 게시글의 경우 기본적으로 켜져 있습니다.
위와 같이 옵션을 켜 준 게시글은 위쪽에 다음과 같이 “다른 언어로 읽기” 메뉴가 표시되게 됩니다. 이 메뉴에 나오는 언어 목록은 언어 설정에서 정할 수 있습니다.
이 중에서 이미 번역이 완료된 언어는 바로 표시되지만, 아직 번역이 완료되지 않은 언어의 경우, 아래와 같이 기다리라는 메시지가 뜨게 됩니다. 게시글의 분량에 따라 번역 시간은 차이가 나지만, 짧으면 30초에서 길면 5분 정도 걸립니다.
번역이 완료되면, 아래와 같이 메시지가 바뀝니다.
번역 기능은 제가 Hackers' Pub을 맨 처음 구상할 때부터 핵심 기능으로 고려하고 있던 것이었습니다. 소프트웨어 프로그래머로서 일정 수준 이상 성장하기 위해서는 반드시 영어를 배워야만 하는 불합리함이나 그리고 일본어나 중국어 등 영어가 아닌 언어로 쓰인 다양한 자료에 대부분의 외국인은 접근하지 못한다는 아쉬움을 오래 전부터 느꼈기 때문입니다. 다행히 얼마 전부터 LLM의 번역 품질이 아주 좋아졌고, 이를 활용하여 꽤 괜찮은 품질의 번역 기능을 Hackers' Pub 같은 작은 웹사이트에서도 구현할 수 있게 되었네요.
참고로 현재 번역에 쓰이는 모델은 Claude Sonnet 3.7입니다. 저렴하다고는 할 수 없는 모델인데요. 시범적으로 운영해 보고, 비용이 너무 부담된다고 여겨지면 Gemini 2.5 Flash 같은 다른 모델로 전환하는 것도 고려하고 있습니다.
아무튼, 모처럼 추가한 번역 기능이니 많은 분들이 유용함을 누리셨으면 좋겠습니다.
아래는 제가 샘플로 미리 만들어 둔 번역본들입니다:
- Ditch the DIY Drama: Why Use Fedify Instead of Building ActivityPub from Scratch? (영어) → 〈DIY 드라마는 그만: 왜 ActivityPub을 처음부터 구축하는 대신 Fedify를 사용해야 할까요?〉 (한국어)
- 〈애플리케이션 개발 측면에서 본 Drizzle ORM 대 Kysely 비교〉 (한국어) → 「アプリケーション開発の観点から見たDrizzle ORMとKyselyの比較」 (일본어)
- 〈deno-task-hooks: Git 훅을 Deno 태스크로 쉽게 관리하기〉 (한국어) → deno-task-hooks: Easily Manage Git Hooks as Deno Tasks (영어)
- Browser-Native Translation and Language Detection APIs Coming Soon (영어) → 〈브라우저 네이티브 번역 및 언어 감지 API 곧 출시 예정〉 (한국어)
@meWoojin Kim
@hongminhee洪 民憙 (Hong Minhee) 여기서 불만족스러우신 부분이 이미지 태그를 손으로 수정하는 부분일텐데, 사실 딱 그문제를 최소한의 개념으로 해결하는게 Nix이긴 합니다. 토끼굴에 빠질수있어 적극적으로 영업은 못하겠습니다만ㅋㅋ
@bglbgl gwyng
@meWoojin Kim 뭔가 Discord 같은 곳으로 알림이 와서 버튼 딸깍 누르면 배포됐으면 좋겠어요. ㅋㅋㅋ
과연 나는 언제까지 compose.yaml에서 이미지 태그 수정하고 docker compose up -d를 하는 수동 배포 방식을 유지할 것인가…
@resistanHyunjin Cho 보고 감사합니다!
오늘도 해커스펍 GraphQL API 깎기 해야지
오늘도 해커스펍 GraphQL API 깎기 해야지
@xiniha 하루 빨리 GraphQL API를 완성하여 Solid의 세계로…!
@morealLee Dogeon 기반 맞다고 듣긴 했는데, 뭔가 실시간으로 동기화되는 건 아닌 것 같았어요.
@hongminhee洪 民憙 (Hong Minhee) 이런 오류가 났어요. 넣고 싶었던 URL은 https://url.kr/nv1yzk 이 곳의 원래 주소입니다.
@resistanHyunjin Cho 보고 감사합니다!
Hello, Hackers' Pub!
@hatchling13Jung Wook Park 반갑습니다!
Hello, Hackers' Pub!
"부작용으로 좋은 일이 생기지"가 어색한 느낌이라서, 번역어로 선택할 때 좀 고민되긴 합니다.
@hongminhee洪 民憙 (Hong Minhee)
@lionhairdino 네, “부작용”을 “부정적인 효과” 정도로 받아들이는 사람들이 많나 싶어요.
개인적으로 영단어 “side effect”의 가장 적절한 번역은 “부작용”이라고 생각하고, 실제로 프로그래밍 이외의 분야에서는 여전히 이 번역어를 가장 많이 쓰는 것 같은데… 사람들이 “부작용”을 副作用이 아니라 否(?)作用이라고 착각하는 것을 염려해서인지 프로그래밍 분야에서는 “부수 효과” 같은 번역어를 더 많이 쓰는 듯하다. “부작용”의 “부”(副)는 “사장”–“부사장”할 때의 “부”인데 말이다.
LLM가 디버깅을 어려워하면 중간에 멈추고 모델을 바꿔보면 해결되는 경우도 종종 있다.
Visual Studio Code의 GitHub Copilot 확장을 쓰면 에이전트에게 콘텍스트로 problems를 줘서 린트나 타입 오류를 보여줄 수 있긴 한데, 그보다는 타입 추론 결과를 볼 수 있게 해줘야 하는 게 아닌가 싶다.
바이브 코딩에도 시간 제한을 둬야 할 것 같다. 바이브 코딩으로 삽질한 지 1시간 됐으면 얼른 포기하고 수제 코딩하는 식으로…
LLM가 디버깅을 어려워하면 중간에 멈추고 모델을 바꿔보면 해결되는 경우도 종종 있다.
아쉽게도 w3m으로 Hackers' Pub에 포스트 올리기 해보니까 에러가 난다.
@perlmint JavaScript가 필요해서 그럴 거예요…
This new FediDB v2 webapp can be self-hosted btw!
Working on adding a few new pages/features to FediDB, including:
- translation support (i18n)
- a federated wiki (👀)
- apps + clients
- popular accounts
- viral topics
- trends
- quarterly reports
- stats overview w/ geomaps + advanced filtering
And much more ✨
> git clone https://github.com/fedidb/fedidb-nuxt
부끄럽지만 typst로 깎은 이력서와 포트폴리오를 공개합니다: https://github.com/gidongkwon/resume
게임 클라이언트에서 웹 프론트엔드로 커리어 전환을 하는 단계에 있습니다.
혹 피드백주실 것이 있다면 언제든지 좋아요...!
직링크는 아래:
이력서 - https://gidongkwon.github.io/resume/resume-gidongkwon.pdf
포트폴리오 - https://gidongkwon.github.io/resume/portfolio-gidongkwon.pdf
Relay로 offline db sync를 하고 있었을땐, Relay가 Node의 Id나 Edge의 Cursor가 Opaque란 가정을 하고있는게 걸림돌이라고 느껴졌다. SQLite에 저장하려면 어차피 id로 부터 composite key를 구해야하고, 거기엔 또 order도 존재하는데 Relay는 이런데 전혀 무관심하다. 하지만 일반적인 웹사이트 렌더링에는 저런 가정이 전혀 무리가 없다.
Signal같은건데 incremental update도 되고 GC도 가능한 무언가를 만들려고 했더니 이런 정의가 나왔다. 혹시 비슷한거 알고 계신분 있나요?
type Dynamic<Value, Delta> = {
read(): Value;
disconnect(): void;
updated: Observable<Delta>;
fork(): Dynamic<Value, Delta>;
};
2개 이상의 기기를 동시 컨트롤 할 때 (주로 윈도와 맥을 오갈 때) synergy 라는 프로그램으로 마우스, 키보드 공유해서 사용해 왔는데, 오늘 처음 (MacOS 내장기능의) 맥미니와 맥북에어간의 마우스 키보드 공유를 해보고 놀라움을 금치 못했다. 끊김도 없고 거의 네티이브 유사한 느낌으로 자연스럽다. 물론 제대로 완성도를 느끼려면 더 써봐야겠지만.
@arkjunJuntai Park 이 기능 정말 편하죠!
2개 이상의 기기를 동시 컨트롤 할 때 (주로 윈도와 맥을 오갈 때) synergy 라는 프로그램으로 마우스, 키보드 공유해서 사용해 왔는데, 오늘 처음 (MacOS 내장기능의) 맥미니와 맥북에어간의 마우스 키보드 공유를 해보고 놀라움을 금치 못했다. 끊김도 없고 거의 네티이브 유사한 느낌으로 자연스럽다. 물론 제대로 완성도를 느끼려면 더 써봐야겠지만.
그동안 Relay를 offline db sync 용도로 쓰고있었는데(첨부터 그러려고 했던건 아니고, API 두벌 만드는걸 피하다보니 그 역할도 떠맡음), 그래서 Relay가 킹론상 좋다는건 아는데 실질적으로 장점을 못누리고 살았었다. 근데 지금 추가하는 기능에서는 Relay를 본래 용도에 맞게 쓰고있는데, 설계 고민도 줄여주면서 코드가 쭉쭉 나온다.
Claude Sonnet 3.7이 JavaScript 코딩은 잘 하는 것 같은데, TypeScript 코딩은 별로네…
바이브 코딩에도 시간 제한을 둬야 할 것 같다. 바이브 코딩으로 삽질한 지 1시간 됐으면 얼른 포기하고 수제 코딩하는 식으로…
@hongminhee洪 民憙 (Hong Minhee) 제 관찰과 달라서 의외네요. TS 타입을 맞춰서 짜는걸 잘 못한다는 말씀인가요, 아니면 타입레벨 프로그래밍을 잘 못한다는 말씀인가요? 사실 저는 3.7이 후자를 그 이전의 모델과 달리 매우 잘해서 좀 놀랐습니다.
@bglbgl gwyng 아, 전자를 가리키는 거였습니다. 타입을 못 맞춰서 몇 회를 이터레이트하네요… ㅋㅋㅋ
바이브 코딩이 아니라 바이브 코칭이다. LLM의 작업을 쉴 새 없이 살펴보며 이상한 짓 시도할 때마다 옆에서 코칭해 줘야 함…
Claude Sonnet 3.7이 JavaScript 코딩은 잘 하는 것 같은데, TypeScript 코딩은 별로네…
@hongminhee洪 民憙 (Hong Minhee) 기억이 맞나 모르겠는데, Deno가 npm 모듈중에서 ESM + Only JS는 일찌감치 지원하지 않았나요? 이정도면 나름 최선을 다한건데...
@bglbgl gwyng 처음에는 C 확장 모듈 같은 건 지원 안 했던 걸로 기억합니다. 이제는 잘 지원하고요. 그리고 요즘에는 node_modules 디렉터리 만드는 모드까지도 있습니다. (일부 프레임워크들이 node_modules에 파일들이 있을 것을 가정하기 때문에…)
@hongminhee洪 民憙 (Hong Minhee) 저는 에전에 TS 스트립트 용으로 쓰려고 노력했었는데, 클라이언트 라이브러리가 돌아가는게 없어서 포기했었거든요. 그래서 바로 Bun으로 갈아타서 npm 패키지 썼었습니다. 저랑 비슷한 경로로 Deno 대신 Bun 쓰는 분들이 꽤 될거같아요.
@bglbgl gwyng 근데 이제 사실 Deno도 Bun만큼 Node.js 호환성을 지원하긴 해요. 하지만 이미 Bun에게 사용자를 많이 뺏기긴 했으니 소 잃고 외양간 고치기긴 했죠.
@hongminhee洪 民憙 (Hong Minhee) 오잉? 그냥 원본 마크다운 서식 존중해서 출력해 하면 말을 안듣나요?
@bglbgl gwyng 입력이 길면 출력이 중간에 잘려서 입력을 잘 나눠서 넣어줘야 하네요… 근데 그냥 줄바꿈 기준으로 나누면 코드 블록이나 리스트 중간에 잘리거나 해서 번역이 이상해져요…
LLM으로 번역 기능 만드는데 원본 서식을 그대로 유지하게 하는 게 정말 어려운 것 같다…
그냥 Markdown 파서로 AST 만든 다음에 최상위 노드 기준으로 분할하게 만드는 중… 어떻게 번역 기능 만드는데 쪼개기(chunking) 로직 구현하는 게 제일 오래 걸리냐…
바이브 코딩이 아니라 바이브 코칭이다. LLM의 작업을 쉴 새 없이 살펴보며 이상한 짓 시도할 때마다 옆에서 코칭해 줘야 함…
흑흑… 안돼! (Hackers' Pub은 Deno로 돌아가고 있습니다…)
개인적으로는 Node.js 호환성만 좇고 있는 최근의 Deno 업데이트가 (현실적으로 쓰기 편해지는 것은 맞지만) 조금 실망스럽긴 하다. 그냥 처음의 기조 그대로 밀어붙였다면… 뭐, 오히려 지금보다도 덜 쓰였겠지? 어려운 문제긴 하네…
흑흑… 안돼! (Hackers' Pub은 Deno로 돌아가고 있습니다…)
LLM으로 번역 기능 만드는데 원본 서식을 그대로 유지하게 하는 게 정말 어려운 것 같다…
Deno 2.3 is here:
🌱 deno compile with FFI & Node native add-ons
📦 Local npm packages
⭐ deno fmt CSS/HTML/SQL in tagged templates
🔭 OTel event recording & tracing in distributed services
and more —
Deno 왤케 락파일 레졸루션을 못하지...... 여태 멀리하며 살아왔는데 걍 앞으로도 멀리하는 게 좋을듯
Rust로 작성한 JPEG XL 디코더, jxl-oxide의 버전 0.12.0을 릴리스했습니다. https://github.com/tirr-c/jxl-oxide/releases/tag/0.12.0
CMYK 프로파일 등 복잡한 ICC 프로파일을 지원하기 위해 기존에 사용하던 Little CMS 2 (lcms2) 에 더해, Rust로 작성된 색 관리 시스템인 moxcms 지원을 추가한 것이 주요 변경사항입니다. CLI 툴의 기본 CMS는 아직 lcms2이지만 --cms moxcms 옵션으로 moxcms를 사용할 수 있습니다.
jxl-oxide WebAssembly 데모도 있습니다. https://jxl-oxide.tirr.dev/demo/index.html
와 드디어 오늘도 카피닌자 닉값했다
이 사이트가 아직도 살아있구나. http://www.soen.kr/ (구 winapi dot co dot kr)
알고리즘 공부하시는 분과 이야기 나누다가 생각나서 오랜만에 들어가봤는데 여전한 모습이었다. 정올 공부할 때나 윈도 프로그램 개발할 때 자주 들락거리던 사이트인데 반가운 마음...
.github/copilot-instructions.md, .cursorrules, .windsurfrules, CLAUDE.md… 이것 말고도 많이 있을텐데, 어차피 들어가야 하는 내용은 다 거기서 거기. 지금은 한 파일에 적고 심볼릭 링크로 같은 곳을 바라보게 하고 있지만, .editorconfig처럼 그냥 어떤 식으로든 표준화가 되었으면 좋겠다.
내가 표준을 만든다면 .vibe.md 정도로 하겠다.
.github/copilot-instructions.md, .cursorrules, .windsurfrules, CLAUDE.md… 이것 말고도 많이 있을텐데, 어차피 들어가야 하는 내용은 다 거기서 거기. 지금은 한 파일에 적고 심볼릭 링크로 같은 곳을 바라보게 하고 있지만, .editorconfig처럼 그냥 어떤 식으로든 표준화가 되었으면 좋겠다.
많은 프로그래머가 아이디어를 시각화하기 위해 화이트보드나 종이에 손으로 필기를 한다. 기존에도 AI가 사용자의 필기를 기반으로 코드를 작성해주는 연구는 있었지만, 필기와 코드가 분리되어 있다는 한계를 벗어나지 못했다. Code Shaping은 단순히 스케치를 코드로 변환하는 툴이 아니라, 필기와 코드 편집이라는 두 워크플로우를 통합하는 툴. 사용자가 코드 위에 자유롭게 필기함으로써 코드를 편집할 수 있다. 코드를 한줄씩 작성하는 것이 아니라, 2차원 평면을 탐색하며 코드를 편집하기 때문에 피험자들이 선형적으로 인식했던 코드 작성을 공간적으로 감각하게 되었다고. https://programs.sigchi.org/chi/2025/program/content/189580
@hongminhee洪 民憙 (Hong Minhee) 오 해커스펍 가로 뷰포트 오버플로우를 끼치는 모든 컴포넌트가 전면 수정되었나 보네요. 스크롤 경험이 쾌적해져서 무척이나 편합니다!
@iamuhun김무훈 네,
@perlmint 님과
@morealLee Dogeon 님이 최근에 관련 기여를 많이 해주셨습니다!
해커스펍은 나에게 있어서 훌륭한 교과서..... (열심히 코드 뜯어보면서 뭔가를 만들고 있다는 뜻ㅎ)
이건 좀 억울할 게 부사장도 열심히 해명을 하지만 디스크 레벨(at rest) 암호화 얘기도 아니고 통신 레벨(in transit) 암호화 얘기도 아니고 DB ID랑 암호로 쿼리했을 때 돌아오는 데이터가 암호화되지 않았다고 잘못이라고 하는 것이다. "이중 암호화" 하라는 건데, 일반적인 공격 모델에서 해커는 보통 서버 코드와 변수를 볼 수 있으므로 의미없는 행위다*. 청문회 중 이준석은 어느 순간부터 자신있게 해시를 암호화라고 말하기 시작해서 더욱 혼란스럽게 만드는데, 조금이라도 프로토콜이나 암호학 지식이 있다면 이런 말 못한다.
RE: https://bsky.app/profile/did:plc:wxbkg2wk54g6s2nmb7jd5p74/post/3lnzo7xk7ec2y
洪 民憙 (Hong Minhee) shared the below article:
업자를 위한 아주 인포멀한 모나드 설명
lionhairdino @lionhairdino@hackers.pub
1.
함수형에선, 스트림 [1,2,3]에
(+1)을 map해서 [2,3,4]를 만들고,
(+2)를 map해서 [3,4,5]를 만드는 작업을,
(+2) ∘ (+1)를 [1,2,3]에 map하는 걸로 표현할 수 있어야 한다.
(+1), (+2), ((+2) ∘ (+1)) 함수들은 모두 Int -> Int 함수를 원하는 곳에 넣어 줄 수 있는 함수들이다.
위와 같이, 완벽하게 정보를 유지하진 않지만, 같은 "류"의 작업을 두 번 하는 것을, 한 번 작업하는 것으로 표현할 수 있는 경우도 있다. 예를 들어,
첫 번째 작업으로, "hello"를 로그로 남기고,
두 번째 작업으로, " world"를 로그로 남기는데,
이를 한 번의 작업으로, "hello world"를 로그로 남기는 작업으로 표현할 수 있다.
여기는 로그를 남기는 횟수 정보는 필요 없고, 최종 로그만 필요하다는 인위적 정보 선택이 들어가 있다. 이 인위적 선택(여기선 로그 문자열을 합치는 것)을 수긍해야만 가능하다.
로그를 남기는 작업을 m이라 부를 때, m a를 받는 곳에 m (m a)를 넘길 방법이 생긴다는 뜻이다. 달리 말하면, m (m a)로 표현되는 작업을 인위적인 절차를 거쳐 m a로 만들어도, 내가 필요한 정보는 사라지지 않는다는 뜻이다.
2.
무언가가 하나인데, 유심히 보면 하나가 아닌 경우, 이게 바로 모노이드다. mono는 하나를 뜻하고, ~oid는 "척"하는 걸 말한다. (예. 인간인 척 하는 휴머노이드) 하나인척 하는 게 모노이드다. 수학 책 앞 부분에서 이항 연산, 결합 법칙, 항등원이 있으면 모노이드라는 설명을 하는데, 그래서 모노이드가 뭐에 쓰는 물건인지는 한참 공부해야 알 게 된다.
(아래는 혼자만의 생각입니다.)
모노이드를 바라 보는 눈 중 하나로, "모든 대상을 이항 연산으로 표현"을 들 수 있다.
0을 포함한 자연수들 0,1,2,3,... 들은, + 이항 연산과, 이 연산의 항등원 0이 있으면, 모두 ○ + ○ 한 가지 모양으로 표현할 수 있게 된다.
0 -> 0+0
1 -> 0+1
2 -> 0+(1+1) = 1+1
...
모노이드 구조이기에, 어딘가에서 ○ + ○ 모양을 원한다면, 0,1,2,3,...을 모두 넣어 줄 수 있다.
3.
"어딘가에서 m a를 원한다면, m a, m (m a), m (m (m a)), ...를 모두 넣어 줄 수 있다."를 위와 비교하며 보자.
위에서 얘기한 인위적 선택 작업을 join으로 표현하면,
m (m a) --join--> m a
m (m (m a)) --join--> m (m a) --join--> m a
...
m 반복 작업을 모두 ○ --join--> ○ 모양으로 표현할 수 있을 것만 같다. 그런데, 딱 하나는 표현하지 못한다. join은 m이 두 개 있는 걸, 하나로 만드는 작업이라, m하나를 ○ --join--> ○로 표현하지 못한다. m을 join이 들어간 모양으로 표현하려면, 자연수, + 에서 처럼 0에 대응하는 것이 필요하다. m하나를, m 두 개로 만들되, 최종 결과에 영향을 미치지 않는 pure라는 작업을 만든다. 위 로그 작업을 예로 들면, 로그로 빈문자 ""을 추가하는 작업을 pure로 만든다. 그러면 이제야 비로소, 모든 반복된 m 을 join으로 표현할 수 있게 된다
m a --pure--> m (m a) --join--> m a
m (m a) --join--> m a
m (m (m a)) --join--> m (m a) --join--> m a
...
이제, join절차가 항상 있는 m a를 원하는 곳에 m a도 m (m (m a))도 넣어 줄 수 있게 되었다.
"hello"와 " world"를 남기던 두 개의 작업 합쳐, "hello world"를 남기는 하나의 작업으로 표현할 수 있게 되었다.
※ 지금 눈에 명확히 보이진 않지만, m 둘을 합성하는 연산을 .이라 하면, .만으론 모노이드 이항 연산 역할을 못하지만, join의 도움을 받고, id 만으론 항등원 역할을 못하지만, pure의 도움을 받아 모노이드 구조를 이룬다.
결론.
당연히 모든 내용이 담겨 있진 않고, 모나드를 무엇의 모노이드로 보는 내용을 비수학적으로 풀어 봤다. 모노이드는 모두를 하나의 모양으로 표현 할 수 있다는 걸, 보증해주는 거대한 개념이지만, 업자인 나에겐 "그렇게 해도 된다"는 정도의 느낌만 있다. (결합 법칙이 빠졌는데, 나중에 코드를 모듈화 하는 것과 연관지어 보면, 명확한 대응을 알 수 있다.)
모나드는, 조금 다르게 생긴 것을, 당장 필요한 요소만 잘 관리한다면 "같은 걸로 치자"를 멋지게(,어렵게) 형식화한 이론이다.
사족.
저와 대화를 나눠본 분들은 아시겠지만, 제가 비전공자라 용어 선택이나 개념 정의가 매우 인포멀해서 인상을 찌푸리는 경우도 자주 만듭니다. PL 전공자분들처럼 깊숙히 이론을 파고 싶은 게 아니라, 현실에 적용할 수 있을 만큼의 눈만 가지고 싶습니다. 현실을 모델링할 때, "인위적 정보 선택"을 해서 필요한 정보를 남길 수 있는 경우를 알아채는 눈을 길러야 되는데, bind 또는 flatmap, return 또는 pure가 있는 구조가 모나드라고만 배우면, 이런 눈을 가지는데 매우 오래 걸리는 것 같습니다.
비전공 업자분이 보셨다면, 얻어 가시는 아이디어가 있었으면 좋겠고, 전공자분이 보셨다면, 인포멀한 부분에 너무 인상 찌푸리지 마시고, 틀린 개념이 있다면, 부드럽게 조언을 해주시면 좋겠습니다.
※ 모나드 용어는 mono와 triad에 온 게 아닐까 의심한다는 설이 있습니다.(검색해 보면 근거는 미약해 보입니다.) 모나드는 join, return 그리고 위에서 명시적 언급은 안했지만, 펑터의 fmap, 이렇게 세 개 triad의 도움을 받아 모노이드로 만들 수 있는 구조입니다.
※ "정교한" 내용이 아님을 강조하고 선입견이 생기지 않기 위해, 일부러 제목을 달지 않고, 반말(혼잣말)투로 썼습니다.
제목은
- 함수형
- 모노이드
- 모나드
순서 입니다.
링크 넣으니 오류 나서 ㅠㅠ 무인정보단말기 UI 플랫폼에서 검색해 주세요.
@resistanHyunjin Cho 혹시 어떤 오류가 났는지 기억하시나요?





