
박준규
@curry@hackers.pub · 159 following · 74 followers
프로그래밍 언어 하스켈(Haskell) 덕질하는 계정
darcs hub
- hub.darcs.net/vincent
해키지에 패키지 올렸는데 왜 빌드가 안 돌지?
오늘은 Rust를 현업에서 쓰고 있고 또 좋아하는 고교 동창에게 Haskell을 영업했다.
@hongminhee洪 民憙 (Hong Minhee) 고교 동창분의 반응은 어땠나요?
회사에서 거의 10년 동안 운영한 서버를 교체 중이다. 고생 많으셨습니다. 서버님⋯ 새로 오신 서버님에게는 돼지 머리랑 막걸리 준비는 못했지만 절이라도 올려야겠다.
@kodingwarriorJaeyeol Lee
@quadr최치선 구글 앱스 스크립트를 이용해보세요!(라고 ChatGPT가⋯)
@kodingwarriorJaeyeol Lee 생각보다 사람들은 메일확인을 잘 안하는것 같아요. 제 주변에 읽지않은 메일 0으로 유지하는 사람을 본적이 거의 없네요..
@quadr최치선
@kodingwarriorJaeyeol Lee 구글폼에 메일을 제출하면 즉시 초대장이 가도록 한다면 어떨까요?
해커스 펍에 조와용 버튼이 원래 없었던가
@aiooAhn Kiwook 안녕하세요! 어떻게 구현할지 고민 중이라고 합니다.
해커스펍이 하스켈로 테라포밍되고 있어...!! 이렇게 된 이상 하스켈 학교에서 대량으로 모셔와야만..!!
@kodingwarriorJaeyeol Lee 나만의 작고 소중한 하스켈이⋯
프로그래밍 언어 하스켈은 1990년 4월 1일에 처음 나와 올해 35주년이 되었습니다. 오늘이 하스켈 생일이에요. 이거 만우절 농담 아니고 진짜예요.
현재 Chromium 계열 브라우저에서 Hackers' Pub에 단문 쓰기 등 클라이언트 사이드 JavaScript로 구현된 여러 기능들이 작동하지 않는 버그가 있습니다. 곧 고치도록 할게요.
RE: https://social.silicon.moe/@kodingwarrior/114257504827526192
@hongminhee洪 民憙 (Hong Minhee) 전 모바일에서는 사파리를 쓰고 노트북에서는 파이어폭스를 써서 무사(?)했네요!
아⋯ 0.1.1.1에서 메이저 업데이트면 0.2.0.0으로 했어야 하는데 1.0.0.0으로 잘못 올렸네⋯ 근데 그러면 A자리는 언제 올리는 거지?
RE: https://hackers.pub/@curry/0195ec4b-7343-7316-adc7-5c89372dfca7
하스켈 학교에 다니고 나를 찾는 사람 사라졌다
RE: https://hackers.pub/@curry/0195ec78-1026-7277-a2f0-c783c70cb1b9
@bglbgl gwyng 어디서 노래가 들려요!
ChatGPT에게 링크 주고 요약문 작성을 부탁했다. SNS에 공유할 거라고 했더니 이모지도 막 달아주네⋯ 글쓴이는 하스켈 안정성 작업 그룹(SWG) 의장인 테일러 님인데 학부 때 과목에도 없는 하스켈 쓰다가 교수님이 “너 그런 거 쓰면 취업 못한다.”라고 했다고⋯
아이고, 테일러 님이 아니라 트레비스(Trevis Elser) 님이 SWG 의장이고 소개한 일화 주인공이다. 테일러 님은 그냥 다른 하스켈러이다.
📢 Haskell 생태계에서 안정성이란 무엇일까요?
Haskell 재단의 안정성 작업 그룹(SWG)이 생태계의 변화를 효과적으로 관리하기 위해 어떤 노력을 기울이고 있는지 소개합니다. GHC 언어 확장 분류, 컴파일러 안정성 기능 개선, 커뮤니티 소통 촉진 등 우리가 진행한 작업과 앞으로 나아갈 방향에 대해 이야기합니다. 함께 Haskell 생태계를 더 강하게 만들어가요! 💪🚀
🔗 자세히 보기
ChatGPT에게 링크 주고 요약문 작성을 부탁했다. SNS에 공유할 거라고 했더니 이모지도 막 달아주네⋯ 글쓴이는 하스켈 안정성 작업 그룹(SWG) 의장인 테일러 님인데 학부 때 과목에도 없는 하스켈 쓰다가 교수님이 “너 그런 거 쓰면 취업 못한다.”라고 했다고⋯
📢 Haskell 생태계에서 안정성이란 무엇일까요?
Haskell 재단의 안정성 작업 그룹(SWG)이 생태계의 변화를 효과적으로 관리하기 위해 어떤 노력을 기울이고 있는지 소개합니다. GHC 언어 확장 분류, 컴파일러 안정성 기능 개선, 커뮤니티 소통 촉진 등 우리가 진행한 작업과 앞으로 나아갈 방향에 대해 이야기합니다. 함께 Haskell 생태계를 더 강하게 만들어가요! 💪🚀
🔗 자세히 보기
ChatGPT 덕분에 우연히 하찮은 버그 하나를 발견했다.
ChatGPT에게 소스 코드 보여주고 주석으로 문서 작성을 부탁했는데 다음과 같이 알아서 파이썬 doctest와 같은 코드를 출력했다.
>>> prefixLength "key=value"
3
>>> prefixLength "a=b"
1
>>> prefixLength "noequals"
8
이 함수는 입력 문자열에서 ‘=’ 왼쪽에 있는 문자열의 길이를 리턴한다. 그런데 ‘=’가 없을 경우는 미처 생각을 못했는데 ChatGPT가 출력한 코드를 보고 그 사실을 깨달았다.
덕분에 코드 패치하고 난생 처음 메이저 업데이트라는 것도 해본다.(원래 리턴 타입이 Int
였는데 Maybe Int
로 바꿔서 브레이킹 체인지가 되었다.)
https://hackage.haskell.org/package/align-equal-0.1.1.1/docs/Data-Text-AlignEqual.html
좋은 글 잘 읽었습니다. 글도 잘 쓰시고 코딩도 잘 하시고 부럽습니다. 본문 내용 중 ‘두부와 강철 영수증’이란 표현이 재밌네요. ‘오라클’이라는 전문 용어도 처음 알게 되었습니다. 과거에 하시던 블록체인과 현재 하시는 액티비티펍이 뭔가 탈중앙화라는 공통 분모가 있는 것 같네요.
사실 인용 버튼을 만들고 싶었는데 아이콘을 못 골랐습니다. 뭘 골라도 댓글 버튼이랑 헷갈려서… 😂
RE: https://hackers.pub/@hongminhee/0195e9ea-4d47-7389-9c0a-b1f6fe323fa3
@hongminhee洪 民憙 (Hong Minhee) 따옴표 아이콘은 어떨까요?
인용RT 어떻게 하는걸까요? 저만 모르거나, 그게 아니라면 하는 방법을 좀더 알기쉽게 하면 좋을거 같습니다
@bglbgl gwyng 해커스펍에서 인용하고 싶은 글의 링크를 글 작성란에 붙여 넣기 하면 인용을 인식해서 인용 여부를 물어봅니다.
인라인 스크립트 메타데이터를 기술하는 PEP 723 규격과 Unix 셔뱅(shebang), 그리고 차세대 Python 패키지 관리자인 uv를 이용하여 단일 파일로 실행되는 Python 스크립트를 만드는 방법. 물론 uv가 시스템에 설치되어 있어야 하기 때문에 진정으로 “self-contained”하지는 않다.
참고로 PEP 723 규격은 pipx 등도 구현하고 있기 때문에, 반드시 uv가 아니더라도 다른 도구로도 비슷한 스크립트를 만드는 게 가능하다.
@hongminhee洪 民憙 (Hong Minhee) shebang의 발음이 ‘셔뱅’이었다니! 지금까지 ‘쉬뱅’으로 읽었네요.
@hongminhee洪 民憙 (Hong Minhee) 다음과 같이 단문에 인라인 코드 마크다운을 쓸 경우 적용이 안 되는데 수정 가능할까요?
@disjukrㄹ 그러니까
(width >= 300px) ⊂ (width >= 200px)
이라서 300px로 적용된다는 말씀이죠?
@bglbgl gwyng
@disjukrㄹ CSS에서 그렇게 뭔가 연산을 해서 스타일을 적용하는 로직은 없을 걸요? 여기서는
.box2
가 .box1
보다 나중에 선언됐기 때문에 d1
과 d2
모두 .box2
가 적용됩니다.
검색 우측 '1' 표시를 누르면 'Internal server error'이 뜹니다. 조금전 긴 글을 올렸는데 피드에 노출은 되질 않았습니다.
긴 글(본문 내 다수 링크 포함) 올리는 방법이 별도로 있나요?
@kkumaeunsonyeon꿈많은소년 해커스펍 화면 우측 상단 프로필 사진 왼쪽에 있는 ‘새 게시글’을 클릭하면 긴 글을 쓸 수 있습니다.
‘조용히 공개’의 효과는 무엇인가요? 조용히 공개된 글을 부스트하면 어떻게 되나요?
이제 막 탄생해서 사용자가 많지 않은 서비스를 초기에 접하면 원하는 아이디를 선점할 수 있어서 좋다.
최근에는 LLM에 흥미를 느끼고 있어서, LLM을 활용하는 서비스 개발에 대해 공부하고 있는데요.
인공지능에 관련된 일자리는 대부분 석사 이상의 학위나 3년 이상의 경력을 요구하기 때문에 개발자로서 경력을 쌓을 곳이 필요합니다.
신입 채용이 열려있으며 인공지능으로 나아가기 좋은 발판을 만들어주는 일자리에는 무엇이 있을까요?
@zer0ken이현령 남세동 님이 대표인 보이저엑스를 추천합니다. LLM만 쓰시진 않고 AI는 가리지 않고 서비스 개발을 주로 하는 걸로 알고 있습니다. 페이스북에서 남세동 님의 글을 살펴 보면 대표님의 생각과 보이저엑스 회사의 기업 문화를 엿볼 수 있습니다.
darcs에 브랜치라는 개념이 없고 대신 저장소를 복제해서 패치를 선별적으로 적용한다고 한다. 프로그래밍 책 읽으면서 연습 문제를 풀려고 하는데 본문과 연습 문제가 다른 시간선(?)을 달려서 브랜치를 써볼까 했는데 브랜치가 없네⋯ https://chatgpt.com/share/67e8f4fd-7274-800c-8565-42c76aabd6e5
@alternative 이렇게나 다양한 서비스가 많이 있는지 몰랐습니다.
@curry박준규 알림기능이 먼저 만들어질지 아니면 마스토돈 API 지원이 먼저일지 세기의 경쟁
@kodingwarriorJaeyeol Lee 알림 기능은 우선 우리인생처럼 ‘메일 발송’으로 구현하면 어떨까요?
@bglbgl gwyng
@curry박준규 펑터(Functor)의 수학귀신적 번역어로 ‘구조를 보존하는’은 어떤가요?
‘그물망 던지기’는 어떤 의미인가요? 펑터와 어떻게 연결해야 할지 모르겠어요.
해커스펍 계정은 쓰기 전용으로, 우리인생은 읽기전용으로 사용하고 있다. 또는 기술 관련 콘텐츠는 해커스펍에 올리고 일상은 우리인생에 올리려고 한다.
클라이언트는 팬피를 쓰고 있는데 해커스펍은 마스토돈 API 구현이 안 되어 있어서 팬피에는 우리인생 계정을 연동했다.
그런데 팬피에서 재밌게 글을 읽다 보면 무심코 팬피에서(우리인생 계정으로) 해커스펍 글에 댓글을 달아서 뭔가 곤란하다⋯
그리고 해커스펍에 오신 분들은 거의 다 팔로우를 하고 있는데 동시에 우리인생에서도 팔로우를 해야해서(팬피에서 읽어야 하니까) 불편하다.
소프트웨어 개발자들이 자주 틀리는 외래어 표기법.
영어 | 틀린 표기 | 올바른 표기 |
---|---|---|
app | 어플 | 앱 |
application | 어플리케이션 | 애플리케이션 |
directory | 디렉토리 | 디렉터리 |
front-end | 프론트엔드 | 프런트엔드 |
message | 메세지 | 메시지 |
method | 메소드 | 메서드 |
release | 릴리즈 | 릴리스 |
repository | 레포지토리 | 리포지터리 |
또 있을까요?
펑터에 대한 수학귀신적 번역어로 '그물망 던지기'가 떠올랐다.
@bglbgl gwyng 네? ‘수학귀신적’이 뭔가요?
소프트웨어 개발자들이 자주 틀리는 외래어 표기법.
영어 | 틀린 표기 | 올바른 표기 |
---|---|---|
app | 어플 | 앱 |
application | 어플리케이션 | 애플리케이션 |
directory | 디렉토리 | 디렉터리 |
front-end | 프론트엔드 | 프런트엔드 |
message | 메세지 | 메시지 |
method | 메소드 | 메서드 |
release | 릴리즈 | 릴리스 |
repository | 레포지토리 | 리포지터리 |
또 있을까요?
@hongminhee洪 民憙 (Hong Minhee) 포털과 포탈도 있습니다.
네이버에서 이런 걸 왜 만들었을까?
Tamgu는 Prolog에서 영감을 받은 술어 엔진과 Haskell 언어에서 영감을 받은 기능적 기능을 갖춘 명령형 언어입니다. 이 세 가지 프로그래밍 스타일을 자유롭게 혼합할 수 있습니다.
@fedipoJellyPo 하하… 그래서 “자주” 틀리는 표기라고 한 거죠! 많이들 틀립니다. 외래어 표기법에 큰 관심이 없는 경우가 많으니까요.
@hongminhee洪 民憙 (Hong Minhee)
@fedipoJellyPo 솔직히 말해보세요. 위키백과의 세례를 받기 전에는 잘 모르셨죠?!(농담)
Haskell와 Curry 모두 사람 이름이구나
@morealLee Dogeon 그리고 OCaml은 낙타 이름이죠!(헛소리)
@curry박준규
@bglbgl gwyng 알림이 달리 없어서 지나쳐버렸네요, 의견 감사합니다! 혹시 이야기 해주신 UTop이 아래 링크의 UTop이 맞다면, 저 UTop을 직접 구현해보는 걸 추천해주신걸까요?
https://opam.ocaml.org/blog/about-utop/
@morealLee Dogeon
@bglbgl gwyng
@curry박준규 (알림 기능은 곧 구현하실 것 같아요.) 공부하실 때 OCaml의 기본 탑레벨이 사용하기 불편해서 그보다 좀 나은 UTop을 권해드렸습니다.
해커스펍 계정을 만들었습니다. 권유와 초청 주신 분들 감사합니다.
저는 게임 기획자로 일하고 있습니다만, 요즘 몇년은 js/react로 제품에 들어갈 코드를 짜는 일이 많습니다. 최근에는 https://guji.jjme.me/ 에서 블로그를 쓰는 데 많은 에너지를 쓰고 있습니다.
@jjme정진명 안녕하세요. 정진명 님 블로그에서 〈왜 생각을 굳이 써서 남기는가?〉를 잘 읽었습니다. 특히 마지막 문장을 읽고 나서는 마치 뭔가 혼자 운영하시는 방송국에서 방송하시는 걸 듣는 세기말적인 비장함이 느껴져서 좋았습니다. 감사합니다!
@hongminhee洪 民憙 (Hong Minhee) 해커스펍의 ‘게시글만’ 탭을 선택했을 때 개별 게시글을 한 번만 노출되게 하는 방법이 있을까요? 지금은 공유된만큼 게시글이 노출돼서 같은 게시글이 여러 번 나옵니다.
한국의 Clojure 생태계를 책임지는 슈퍼루키 트친도 영입하고 있는 중인데, 이 계정도 추천해야겠다. 아니, 근데.. 클로져리안 모아놓은 인스턴스도 있었네????
@kodingwarriorJaeyeol Lee 없으면 하나 만들려고 했는데 당연하게 이미 haskell.social도 있더라고요.
박준규 replied to the below article:
거꾸로 상태 모나드로 강화 학습 하기 (1/2)

bgl gwyng @bgl@hackers.pub
기계 학습을 전혀 모르고 살면 안 되겠다 싶어, 얼마전부터 하스켈로 공부하기 시작했다.
Hasktorch라고 하스켈용 Torch 바인딩을 사용한다. 이전에 도전했을땐 MNIST까지 하고 다음에 뭘 해야할지 모르겠어서 그만뒀는데, 이번엔 강화 학습으로 이어나가 보기로 했다.
강화 학습은 주어진 환경에서 보상을 최대화하는 에이전트를 학습시키는 것으로, 데이터가 필요없다는게 장점이다. 대신 환경을 만들어야 하는데, 간단한 게임도 환경이 될 수 있다. 게임 만들기는 데이터 모으기와 달리 즐거운 일이니 마다할 필요가 없다.
첫번째로 도전으로 스네이크 게임을 골랐는데, 다들 한번쯤은 해봤을 것이다. 뱀을 조종해 먹이를 최대한 많이 먹으면 되는데, 뱀의 머리가 벽이나 아니면 자기 몸통에 부딪히면 죽는다.
여차여차 학습시켜서 이정도까지 하는데에는 성공했다.
강화 학습 지식이 일천해서 게임을 클리어하는 수준까지는 못 만들겠다. 이 글은 학습을 잘 시키는 방법이 아니라, 강화학습 코드를 어떻게 잘 짜느냐에 대한 것이다.
일단 강화 학습이란걸 형식화 해보자. 앞서 언급한 환경과 에이전트란 단어를 어떻게 정의할수 있을까?
먼저 에이전트의 정의는 이렇다.
type Agent = Observation -> Action
관측 Observation 에 따라 행동 Action 을 선택한다. 나는 눈앞에 콜라가 보이면 마신다.
환경은 에이전트를 실행하는 무언가이다. 일상적인 표현으로 쓰자면, 에이전트를 둘러싼 무언가이다.
runAgent :: Agent -> [Action]
이 runAgent
함수가 환경의 역할을 수행한다. Agent
를 인자로 받아 죽을 때까지 선택한 행동들을 반환한다.
그런데 이건 너무 외연적인 정의고, 환경과 에이전트가 보통 만족할만한 조건을 나열해보자면 이렇다.
- 환경은 상태를 가지고 있고 시간이 지남에 따라 변경된다
- 상태는 에이전트가 무엇을 관측할지를 결정한다
- 에이전트의 행동은 다음 상태에 영향을 끼친다
이 조건들을 바탕으로 환경을 좀더 구체적으로 정의하면 다음과 같다.
class Environment e where
type State e
type Observation e
type Action e
update :: (State e, Action e) -> State e -- 조건 1, 3
observe :: State e -> Observation e -- 조건 2
스네이크 게임에서 상태는 뱀의 모양과 먹이의 위치, 관측은 상태와 같고(플레이어는 전체 게임 화면을 볼 수 있다), 행동은 좌회전과 우회전이 된다.
그런데 뱀이 아무렇게나 좌회전 우회전 한다고 박수 쳐줄순 없고, 우리는 얘한테 바라는 게 있다. 죽지않고 더 많은 먹이를 먹어야 한다. 이를 위해 뱀이 제때 방향을 바꿔서 먹이를 지나치지 않고 먹으면 잘 했다고 보상을 주자. 그러면 뱀은 보상을 더 많이 받을 방법을 학습한다.
type RewardFunction = (Observation, Action) -> Float
보상 함수는 관측와 행동에 따라 보상을 결정한다. 가령 뱀이 먹이 하나를 냠냠하면 보상을 1 주면 된다. 지나쳐버리면 0점이고, 죽었을 때는 -1점을 줄 수도 있다. 당근과 채찍이라 생각하고 정의하면 된다. 또, 보상은 더해서 누적이 되어야 하므로 대충 Float
으로 고른다.
학습을 시키려면 보상을 계산해야하고, 그러기 위해 관측과 행동을 짝지어야한다.
trainAgent :: Agent -> [(Observation, Action)]
runAgent
와 달리 Observation
도 포함되어 있다. 이때 [(Observation, Action)]
을 에피소드 Episode 라고 한다. 에피소드로부터 보상을 구하자.
rewards = fmap (uncurry rewardFn) (trainAgent agent)
rewardFn :: RewardFunction
agent :: Agent
...해치웠나?
에피소드가 어떻게 기록될지를 살펴보자.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
---|---|---|---|---|---|---|---|---|---|---|
행동 | → | ↓ | → | ↓ | ← | ↑ | → | ↓ | ← | ↓ |
보상 | 🍎 | 🍎 | 🍎 | 💀 |
위의 rewards
의 값이 이런 의미일거라고 보인다. 실제로 Float
값을 표시해보자.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
---|---|---|---|---|---|---|---|---|---|---|
행동 | → | ↓ | → | ↓ | ← | ↑ | → | ↓ | ← | ↓ |
보상 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 |
혹시 이상한 걸 찾으셨나요?
이런식으로 보상하는게 틀린 건 아니다. 다만 에이전트가 장기적인 계획을 세우도록 학습시키지 못한다. 먹이를 먹는 순간에만 보상을 받기 때문에, 멀리 떨어진 먹이를 향해 다가가게끔 유도할 수가 없다. 이를 해결하려면 보상을 뒤에서부터 누적시켜야 한다.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
---|---|---|---|---|---|---|---|---|---|---|
행동 | → | ↓ | → | ↓ | ← | ↑ | → | ↓ | ← | ↓ |
보상 | 3 | 3 | 3 | 2 | 2 | 2 | 1 | 0 | 0 | 0 |
rewards = scanr (+) 0 (fmap (uncurry rewardFn) (trainAgent agent))
코딩 테스트용 코드를 짜야할것 같은 느낌이 들었는데, 다행히 scanr
함수 덕분에 쉽게 해결했다.
좀더 개선해볼까.
지금의 보상 체계에서 에이전트는 먼 미래를 고려하며 선택하는 것을 배울 수 있다. 그런데, 사실 뱀이 맨 처음에 좌회전을 하던 우회전을 하던, 죽기 전까지 먹이를 총 몇개 먹는지에 엄청난 영향을 끼칠거 같진 않다. 어떤 시점에서의 선택의 영향은 시간이 지날 수록 점점 희미해진다. 이 점을 반영해서 뱀이 잘못된 편견을 갖지 않도록 도와주자. 미래의 보상을 누적하되, 감쇠율 0.9를 적용하는 것이다.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
---|---|---|---|---|---|---|---|---|---|---|
행동 | → | ↓ | → | ↓ | ← | ↑ | → | ↓ | ← | ↓ |
보상 | 1.93 | 2.15 | 2.39 | 1.54 | 1.71 | 1.90 | 1.00 | 0.00 | 0.00 | 0.00 |
rewards = scanr (\x y -> x + 0.9 * y) 0 (fmap (uncurry rewardFn) (trainAgent agent))
이제 나머지는 GPU한테 맡기면 된다. 조금만 기다리면 위의 동영상에서처럼 움직이는 뱀을 볼 수 있다.
여기서 GPU를 100장 더 사서 뱀 대신에 좀더 우리 삶에 도움되는 에이전트를 학습시킨다면, 그걸 10년전에 했으면, 난 지금 부자가 되어있을지도 모르겠다. 하지만 기회는 이미 떠났고, 난 지금 돈은 없지만 대신 시간은 많다. 그 시간을, 지금의 그럭저럭 볼만한 코드를 쥐꼬리만큼 개선하는데 낭비해보려 한다.
지금 코드에서 뭐가 마음에 안드냐면,
-
보상이 사실 서로 다른 두 개를 가리킨다
먹이를 먹자마자 즉각적으로 주는 보상과, 그것을 누적한 보상, 이렇게 두 개가 있다. 실제로 학습에 사용하는 것은 후자이다. 그런데 막상 보상 함수의 정의는 전자에 대한 것이다. 이는 보상 함수를 계산할 때 미래에 어떤 일이 일어나는지 알수가 없어서 그렇다. 정의를 두 개로 나눈 이유가 의미를 명쾌하게 하기 위해서가 아니라, 그냥 한번에 계산을 할수 없기 때문이다.
-
환경의 정의
위에서 살펴본
runAgent
의 정의가 일견 우아해보일 수 있다. 문제는 그 정의는 환경과 에이전트가 모두 순수 함수일 것을 강요한다는 것이다.Environment
의 정의도 마찬가지다.환경과 에이전트는 각자의 부수효과 Side effect 를 가질 수 있어야 한다. 가령 온라인 게임을 환경으로 삼는다면, 환경은 네트워킹을 할 수 있어야 한다. 또, 에이전트는 매번 똑같은 선택이 아닌 확률적 선택을 하고 싶을텐데, 이는 순수 함수로써는 불가능하다.
그러면 부수효과를 허용하면 되는거 아냐?
맞다. 나처럼 시간이 많다면 직접 해보는 것도 나쁘지 않다. 하지만 정의가 점점 지저분해지는 것을 보게될 것이고...
시간을 아껴주기 위해 정답을 알려주겠다. 환경은 에이전트가 실행될 수 있는 모나드여야 한다. 딱 거기까지여야 한다. 환경과 에이전트 사이에 그 이상의 관계는 부적절하다.
글이 생각했던 것보다 길어져버려서, 오늘은 여기까지 해야겠다. 이어지는 글에서 거꾸로 상태 모나드가 이걸 어떻게 해결하는지 소개한다.
사실 아까 환경이니 에이전트니 어쩌고 할때부터, 진작에 강화 학습을 마스터한 학생들이 이미 다 아는 내용에 지겨워 졸기 시작하는게 보였다.
다음 수업은 재밌을테니, 대신 그때까지 모나드를 배워오세요.
@curry박준규 피인용을 다룬다 하면 어떤 걸까요…? 내 글을 인용한 글의 목록을 보는 건가요?
일단 인용 자체가 ActivityPub 자체에 없어서 확장 스펙으로 정해져 있어요.
@hongminhee洪 民憙 (Hong Minhee) 네, 내 글이 인용된 횟수와 인용한 글의 목록을 보는 걸 말씀 드렸습니다. 인용 자체가 확장 스펙이군요⋯
액티비티펍에서도 트위터에서와 같이 피인용 글을 다루는 스펙이 있나요?
@curry박준규
@hongminhee洪 民憙 (Hong Minhee) 아이를 델고오셔서 인류 최초의 네이티브 하스켈 스피커로 키워보는건 어떨까요?
@bglbgl gwyng
@hongminhee洪 民憙 (Hong Minhee) GHC가 브레이킹 체인지가 심해서 버전업 할 때마다 아이가 힘들 것 같아요⋯
@curry박준규 아하… 준규 님은 가실 예정이신가요?
@hongminhee洪 民憙 (Hong Minhee) 너무 가고 싶은데 육아 때문에 갈 수가 없어서 너무 아쉽습니다. 마음 같아서는 유튜브 라이브 해달라고 하고 싶어요.
@curry박준규 고맙습니다!
@hongminhee洪 民憙 (Hong Minhee) 서울하스켈숲 1회 워크샵 참가 신청서 링크가 공개되었습니다. 다만 대상이 ‘하스켈을 잘 모르는 사람’이네요⋯