{"id":18890884,"url":"https://github.com/igrep/wai-sample","last_synced_at":"2025-04-14T23:31:17.517Z","repository":{"id":47164599,"uuid":"303958596","full_name":"igrep/wai-sample","owner":"igrep","description":"Prototype of a new web application framework based on WAI.","archived":false,"fork":false,"pushed_at":"2024-10-30T08:33:50.000Z","size":661,"stargazers_count":10,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-11T19:25:21.545Z","etag":null,"topics":["framework","haskell","webapp"],"latest_commit_sha":null,"homepage":"","language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/igrep.png","metadata":{"files":{"readme":"README.ja.md","changelog":"ChangeLog.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-10-14T08:58:56.000Z","updated_at":"2024-10-30T08:33:53.000Z","dependencies_parsed_at":"2023-09-27T15:42:33.091Z","dependency_job_id":"a2a31bdd-9872-4eea-9c3e-f5b7c1b69545","html_url":"https://github.com/igrep/wai-sample","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/igrep%2Fwai-sample","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/igrep%2Fwai-sample/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/igrep%2Fwai-sample/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/igrep%2Fwai-sample/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/igrep","download_url":"https://codeload.github.com/igrep/wai-sample/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248978631,"owners_count":21192831,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["framework","haskell","webapp"],"created_at":"2024-11-08T07:57:57.352Z","updated_at":"2025-04-14T23:31:16.779Z","avatar_url":"https://github.com/igrep.png","language":"Haskell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# wai-sample\n\n作成中の、新しい[WAI](https://www.stackage.org/package/wai)ベースのウェブアプリケーションフレームワーク（名前未定）と、そのサンプルアプリを含んだリポジトリーです。\n\n## なぜ新しいフレームワークを？\n\n### 「[Servant](https://docs.servant.dev/en/stable/)でやっていることの大半は、型レベルプログラミングに頼らなくてもできるのでは？」という仮説から\n\nHaskellの世界では現在[Servant](https://docs.servant.dev/en/stable/)と[Yesod](https://www.yesodweb.com/)の二つのウェブアプリケーションフレームワークが有名ですが、この二つはいずれも型レベルプログラミングか独自のDSLという、ちょっと敷居の高い技術の学習を要求します。とりあえず使うだけであればサンプルコードに従って雰囲気で書けば十分なのですが、仕組みが分かりづらく、トラブルシューティングや凝った応用がしにくいでしょう。そこで、型レベルプログラミングに頼らず、**できるだけ単純なHaskell**によって、ユーザーが理解しやすく、なおかつServantに負けないくらい高度な機能を持ったウェブアプリケーションフレームワークを作ることを目指します。\n\n### [makeMistakesToLearnHaskell](https://github.com/haskell-jp/makeMistakesToLearnHaskell)の配信用サーバーとして、誰でもハックできるフレームワークにしたいから\n\n[makeMistakesToLearnHaskell](https://github.com/haskell-jp/makeMistakesToLearnHaskell)は、私がのんびり開発・執筆しているHaskell学習用アプリケーションです\u003csmall\u003e（詳細は以前書いた「[Haskell社内勉強会とHaskell学習ツールの紹介](https://eng-blog.iij.ad.jp/archives/3467)」という記事をご覧ください）\u003c/small\u003e。makeMistakesToLearnHaskellは、現在はコマンドラインアプリケーションとしてインストールして実行するものですが、インストールするためにはGHCとかをインストールしないといけないので、そこでハマるひとが多数いました。\n\n- ➡️インストール不要なものを作ろう\n    - ➡️ ユーザーが入力したコードをサーバーで実行して判定するサーバー\n- ➡️ フレームワークから作ろう\n    - ➡️ Haskell学習したて人でも修正できるOSSにしたいという理想により、簡単に理解できるフレームワークから作ることに\n        - ➡️ 型レベルプログラミングなど、GHCの高度な機能なしで使えるフレームワーク\n\n\n## 2021年7月現在までの開発\n\n### 2020年10月～2020年12月\n\nこれより前は、makeMistakesToLearnHaskellの開発を配信しながら学習する、という進め方をしていましたが、ネタ切れ  \n➡️サーバーをフレームワークから作ろう！\n\n💡makeMistakesToLearnHaskell自身も「習いたてのHaskellerでも開発できる」ことを目指しているので、勉強会で配信するのにも向いていた\n\n[プログラミングHaskell](https://www.lambdanote.com/products/haskell)の第13章を参考にパスをパースして、マッチしたパスに登録したアクションを起動\n\n\u003chttps://github.com/igrep/wai-sample/blob/3408f55f140dca1078348c0b1fa1b8608a4b36b9/src/WaiSample.hs#L28\u003e\n\n### 2020年12月～2021年1月\n\nルーティングテーブルを構成する型を defunctionalize して、複数の解釈ができるように。\n\n\u003chttps://github.com/igrep/wai-sample/blob/e527a98c28d2d63d335541f8f3b5016a27780c8f/src/WaiSample.hs#L35\u003e\n\n- ⚠️当時は defunctionalization と呼んでいたけど、合っているかな？\n- ➡️ルーターだけでなく、ルーティングテーブルの生成もできるようになった！\n\n### 2021年2月～2021年6月\n\nクライアントの自動生成にもチャレンジ\n\n\u003chttps://github.com/igrep/wai-sample/blob/c567086a7079225052e59f2ee15782c557047b07/src/WaiSample.hs#L57\u003e\n\n- handlerの名前を指定するようになったのがポイント\n\n\u003chttps://github.com/igrep/wai-sample/blob/c567086a7079225052e59f2ee15782c557047b07/src/WaiSample/Client.hs#L30\u003e\n\n\u003chttps://github.com/igrep/wai-sample/blob/c567086a7079225052e59f2ee15782c557047b07/app/WaiSample/Client/Sample.hs\u003e\n\n- 😓なるべく使いたくなかったけど、さすがにTemplate Haskellを使わなければダメだった\n- その他、大本の設計にもミスが見つかったので修正\n\n### 2021年6月～\n\n- (WIP) パスのパースを、`pathInfo`関数が返した`[Text]`に対して行うのではなく、`[Text]`を`/`でくっつけた`Text`に対してパースすることで、ユーザーがパースをより柔軟にできるように\n    - 🤔Servantなどではどうやって実現してるんだろう\n\n\u003chttps://github.com/igrep/wai-sample/commit/b8b8c002ba9e23146020f49cad04f3d9074a2e17\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Figrep%2Fwai-sample","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Figrep%2Fwai-sample","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Figrep%2Fwai-sample/lists"}