summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormuqiuhan <[email protected]>2025-03-31 02:00:53 +0000
committermuqiuhan <[email protected]>2025-03-31 02:00:53 +0000
commitce98478504ebd13e8f9e6744508968806e8b8b49 (patch)
tree97a964c98feb9e0e9eab30bc7db62a4951a1ddb4
parent229283bf6d0c15abb4e0dd8cf6bb2e528b8f9c9a (diff)
downloadblog-ce98478504ebd13e8f9e6744508968806e8b8b49.tar.gz
deploy: 5a10a30f2e41cb5f9ddba5153ce5931f8629b449
-rw-r--r--2025/03/30/F-重载解析问题/index.html5
-rw-r--r--2025/03/31/在F-中处理复杂依赖注入的实践指南/index.html312
-rw-r--r--archives/2025/03/index.html18
-rw-r--r--archives/2025/index.html36
-rw-r--r--archives/2025/page/2/index.html18
-rw-r--r--archives/index.html36
-rw-r--r--archives/page/10/index.html36
-rw-r--r--archives/page/11/index.html36
-rw-r--r--archives/page/12/index.html36
-rw-r--r--archives/page/13/index.html18
-rw-r--r--archives/page/2/index.html36
-rw-r--r--archives/page/3/index.html36
-rw-r--r--archives/page/4/index.html36
-rw-r--r--archives/page/5/index.html36
-rw-r--r--archives/page/6/index.html36
-rw-r--r--archives/page/7/index.html36
-rw-r--r--archives/page/8/index.html36
-rw-r--r--archives/page/9/index.html36
-rw-r--r--search.xml60
-rw-r--r--tags/Technique/index.html36
-rw-r--r--tags/Technique/page/2/index.html38
-rw-r--r--tags/Technique/page/3/index.html38
-rw-r--r--tags/Technique/page/4/index.html36
-rw-r--r--tags/Technique/page/5/index.html18
24 files changed, 757 insertions, 308 deletions
diff --git a/2025/03/30/F-重载解析问题/index.html b/2025/03/30/F-重载解析问题/index.html
index 4e2a8915..e385b1c9 100644
--- a/2025/03/30/F-重载解析问题/index.html
+++ b/2025/03/30/F-重载解析问题/index.html
@@ -196,6 +196,11 @@
<nav class="post-nav">
<div class="prev-item">
+ <div class="icon arrow-left"></div>
+ <div class="post-link">
+ <a href="/2025/03/31/%E5%9C%A8F-%E4%B8%AD%E5%A4%84%E7%90%86%E5%A4%8D%E6%9D%82%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5%E7%9A%84%E5%AE%9E%E8%B7%B5%E6%8C%87%E5%8D%97/">Prev</a>
+ </div>
+
</div>
<div class="next-item">
diff --git a/2025/03/31/在F-中处理复杂依赖注入的实践指南/index.html b/2025/03/31/在F-中处理复杂依赖注入的实践指南/index.html
new file mode 100644
index 00000000..3a9b6516
--- /dev/null
+++ b/2025/03/31/在F-中处理复杂依赖注入的实践指南/index.html
@@ -0,0 +1,312 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="UTF-8">
+<meta name="viewport"
+ content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
+<meta http-equiv="X-UA-Compatible" content="ie=edge">
+
+ <meta name="author" content="韩暮秋">
+
+
+ <meta name="subtitle" content="暮秋小屋">
+
+
+ <meta name="description" content="这里是暮秋小屋,思念和灵感的寄存处">
+
+
+ <meta name="keywords" content="韩暮秋,MuqiuHan,'Muqiu Han', 'muqiu han', muqiuhan">
+
+
+
+
+<title>在F#中处理复杂依赖注入的实践指南 | 暮秋小屋</title>
+
+
+
+ <link rel="icon" href="/favicon.ico">
+
+
+
+<style>
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&family=Roboto+Mono&display=swap');
+</style>
+
+
+
+ <!-- stylesheets list from _config.yml -->
+
+ <link rel="stylesheet" href="/css/style.css">
+
+
+
+
+
+ <!-- scripts list from _config.yml -->
+
+ <script src="/js/frame.js"></script>
+
+
+
+
+
+ <script src="https://polyfill.alicdn.com/polyfill.js?features=es6"></script>
+ <script id="MathJax-script" async src="https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/mathjax/3.2.0/es5/tex-mml-chtml.js"></script>
+
+
+
+
+
+
+
+ <meta name="generator" content="Hexo 6.3.0"></head>
+ <body>
+ <div class="mask-border">
+ </div>
+
+ <div class="wrapper">
+
+ <div class="header">
+ <div class="flex-container">
+ <div class="header-inner">
+ <div class="site-brand-container">
+ <a href="/">
+
+ 暮秋小屋
+
+ </a>
+ </div>
+ <div id="menu-btn" class="menu-btn" onclick="toggleMenu()">
+ Menu
+ </div>
+ <nav class="site-nav">
+ <ul class="menu-list">
+
+
+ <li class="menu-item">
+ <a href="/">主页</a>
+ </li>
+
+
+
+ <li class="menu-item">
+ <a href="/categories/gallery/">日记本</a>
+ </li>
+
+
+
+ <li class="menu-item">
+ <a href="/tags/Medicine/">医学</a>
+ </li>
+
+
+
+ <li class="menu-item">
+ <a href="/tags/Technique/">计算机科学</a>
+ </li>
+
+
+
+ <li class="menu-item">
+ <a href="/tags/Life/">生活</a>
+ </li>
+
+
+
+ <li class="menu-item">
+ <a href="/about">关于</a>
+ </li>
+
+
+
+ <li class="menu-item search-btn">
+ <a href="#">Search</a>
+ </li>
+
+ </ul>
+ </nav>
+ </div>
+ </div>
+</div>
+<script src="/js/menu.js"></script>
+
+
+ <div class="main">
+ <div class="flex-container">
+ <article id="post">
+
+
+ <div class="post-head">
+ <div class="post-info">
+ <div class="tag-list">
+
+
+ <span class="post-tag">
+ <a href="/tags/Technique/">
+ Technique
+ </a>
+ </span>
+
+
+ </div>
+ <div class="post-title">
+
+
+ 在F#中处理复杂依赖注入的实践指南
+
+
+ </div>
+ <span class="post-date">
+ Mar 31, 2025
+ </span>
+ </div>
+ <div class="post-img">
+
+ <div class="h-line-primary"></div>
+
+ </div>
+</div>
+ <div class="post-content">
+ <p>以下是基于用户提供的文章内容的详细解读博客文章,结合了相关引用资源以增强内容深度:</p>
+<hr>
+<h1 id="在F-中处理复杂依赖注入的实践指南"><a href="#在F-中处理复杂依赖注入的实践指南" class="headerlink" title="在F#中处理复杂依赖注入的实践指南"></a>在F#中处理复杂依赖注入的实践指南</h1><p>依赖注入(DI)是构建松耦合、可维护系统的核心模式。在面向对象语言中,DI框架(如Spring)通过反射和容器管理依赖关系。在 F# 中,则更倾向于利用语言特性(如 Partial Application 和 Type Inference)实现依赖管理。</p>
+<hr>
+<h2 id="一、传统方法:Partial-Application"><a href="#一、传统方法:Partial-Application" class="headerlink" title="一、传统方法:Partial Application"></a>一、传统方法:Partial Application</h2><p>在函数式编程中,Partial Application 是传递依赖的常用方式。例如:</p>
+<figure class="highlight fsharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> foo bar baz request <span class="operator">=</span> <span class="operator">...</span></span><br><span class="line"><span class="keyword">let</span> wired <span class="operator">=</span> foo dependency1 dependency2</span><br><span class="line"><span class="keyword">let</span> response <span class="operator">=</span> wired request</span><br></pre></td></tr></table></figure>
+
+<p><strong>优点</strong>: </p>
+<ul>
+<li>无需框架或反射,直接通过函数参数传递依赖。 </li>
+<li>符合函数式编程的纯函数理念。</li>
+</ul>
+<p><strong>缺点</strong>: </p>
+<ol>
+<li><strong>参数爆炸</strong>:当功能扩展时,参数数量激增(如日志、数据库、加密等)。 </li>
+<li><strong>维护困难</strong>:新增依赖需修改所有调用点的参数传递。 </li>
+<li><strong>隐式依赖</strong>:难以从函数签名直接区分核心参数与辅助依赖。</li>
+</ol>
+<hr>
+<h2 id="二、结构化方法:单一环境参数(env)"><a href="#二、结构化方法:单一环境参数(env)" class="headerlink" title="二、结构化方法:单一环境参数(env)"></a>二、结构化方法:单一环境参数(<code>env</code>)</h2><p>为解决参数爆炸问题,可将依赖封装为单一环境对象<code>env</code>,并通过接口约束访问权限:</p>
+<figure class="highlight fsharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">[&lt;Interface&gt;]</span> <span class="keyword">type</span> <span class="title class_">ILog</span> <span class="operator">=</span> <span class="keyword">abstract</span> Logger<span class="operator">:</span> ILogger</span><br><span class="line"><span class="meta">[&lt;Interface&gt;]</span> <span class="keyword">type</span> <span class="title class_">IDb</span> <span class="operator">=</span> <span class="keyword">abstract</span> Database<span class="operator">:</span> IDatabase</span><br><span class="line"></span><br><span class="line"><span class="keyword">module</span> Log <span class="operator">=</span></span><br><span class="line"> <span class="keyword">let</span> info (env<span class="operator">:</span> #ILog) <span class="operator">=</span> env.Logger.Info(<span class="string">&quot;Message&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">module</span> Db <span class="operator">=</span></span><br><span class="line"> <span class="keyword">let</span> fetchUser (env<span class="operator">:</span> #IDb) <span class="operator">=</span> env.Database.Query(<span class="operator">...</span>)</span><br></pre></td></tr></table></figure>
+
+<p><strong>优点</strong>: </p>
+<ul>
+<li><strong>显式依赖声明</strong>:函数签名仅需<code>env</code>参数,编译器验证接口实现。 </li>
+<li><strong>模块化隔离</strong>:各模块仅声明所需接口(如<code>ILog</code>、<code>IDb</code>),避免全局依赖。 </li>
+<li><strong>易于测试</strong>:通过模拟<code>env</code>实现单元测试,无需依赖具体实现。</li>
+</ul>
+<p><strong>应用场景</strong>: </p>
+<figure class="highlight fsharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> changePass env req <span class="operator">=</span> <span class="keyword">task</span> &#123;</span><br><span class="line"> <span class="keyword">let!</span> user <span class="operator">=</span> Db.fetchUser env req.UserId</span><br><span class="line"> Log.info env <span class="string">&quot;Processing user: %i&quot;</span> user.Id</span><br><span class="line"> <span class="operator">...</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
+
+<hr>
+<h2 id="三、Reader-Monad"><a href="#三、Reader-Monad" class="headerlink" title="三、Reader Monad"></a>三、Reader Monad</h2><p>为消除显式的<code>env</code>传递,可引入 Reader Monad,将环境隐式注入计算流程:</p>
+<figure class="highlight fsharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">[&lt;Struct&gt;]</span> <span class="keyword">type</span> <span class="title class_">Effect</span><span class="operator">&lt;</span><span class="symbol">&#x27;env</span>, <span class="symbol">&#x27;out</span><span class="operator">&gt;</span> <span class="operator">=</span> Effect <span class="keyword">of</span> (<span class="symbol">&#x27;env</span> <span class="operator">-&gt;</span> <span class="symbol">&#x27;out</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">module</span> Effect <span class="operator">=</span></span><br><span class="line"> <span class="keyword">let</span> run env (Effect fn) <span class="operator">=</span> fn env</span><br><span class="line"> <span class="keyword">let</span> bind f effect <span class="operator">=</span> Effect (<span class="keyword">fun</span> env <span class="operator">-&gt;</span> run env (f (run env effect)))</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> <span class="title class_">EffectBuilder</span>() <span class="operator">=</span></span><br><span class="line"> <span class="keyword">member</span> __.Bind(e, f) <span class="operator">=</span> Effect.bind f e</span><br><span class="line"> <span class="keyword">member</span> __.Return(x) <span class="operator">=</span> Effect (<span class="keyword">fun</span> _ <span class="operator">-&gt;</span> x)</span><br><span class="line"></span><br><span class="line"><span class="keyword">let</span> effect <span class="operator">=</span> EffectBuilder()</span><br></pre></td></tr></table></figure>
+
+<p>然后:</p>
+<figure class="highlight fsharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> changePass req <span class="operator">=</span> <span class="keyword">effect</span> &#123;</span><br><span class="line"> <span class="keyword">let!</span> user <span class="operator">=</span> Db.fetchUser req.UserId</span><br><span class="line"> <span class="keyword">let!</span> salt <span class="operator">=</span> Random.bytes <span class="number">32</span></span><br><span class="line"> <span class="keyword">do!</span> Log.info <span class="string">&quot;Password updated for user %i&quot;</span> user.Id</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">Ok</span>()</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
+
+<p><strong>优点</strong>: </p>
+<ul>
+<li><strong>隐式依赖管理</strong>:通过<code>effect</code>计算表达式自动传递<code>env</code>,减少样板代码。 </li>
+<li><strong>组合性</strong>:支持与其他计算表达式(如<code>async</code>&#x2F;<code>task</code>)结合,处理异步操作。</li>
+</ul>
+<p><strong>缺点</strong>: </p>
+<ul>
+<li><strong>性能开销</strong>:频繁的闭包创建和间接调用可能导致性能下降。 </li>
+<li><strong>生态兼容性</strong>:需自定义计算表达式,与现有异步框架集成复杂。</li>
+</ul>
+<h2 id="Refs"><a href="#Refs" class="headerlink" title="Refs."></a>Refs.</h2><ul>
+<li>Spring的构造器注入</li>
+<li>Blazor的DI实现</li>
+</ul>
+
+</div>
+
+<script>
+ window.onload = detectors();
+</script>
+ <div class="post-footer">
+ <div class="h-line-primary"></div>
+ <nav class="post-nav">
+ <div class="prev-item">
+
+ </div>
+ <div class="next-item">
+
+ <div class="icon arrow-right"></div>
+ <div class="post-link">
+ <a href="/2025/03/30/F-%E9%87%8D%E8%BD%BD%E8%A7%A3%E6%9E%90%E9%97%AE%E9%A2%98/">Next</a>
+ </div>
+
+ </div>
+ </nav>
+</div>
+
+
+ <div class="post-comment">
+
+
+
+
+
+
+
+</div>
+
+
+</article>
+ </div>
+ </div>
+
+ <div class="footer">
+ <div class="flex-container">
+ <div class="footer-text">
+
+
+ |
+
+
+ 希望路过的人可以添点柴火让这里暖和点
+
+ </div>
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="search-popup">
+ <div class="search-popup-overlay">
+ </div>
+ <div class="search-popup-window" >
+ <div class="search-header">
+ <div class="search-input-container">
+ <input autocomplete="off" autocapitalize="off" maxlength="80"
+ placeholder="Search Anything" spellcheck="false"
+ type="search" class="search-input">
+ </div>
+ <div class="search-close-btn">
+ <div class="icon close-btn"></div>
+ </div>
+ </div>
+ <div class="search-result-container">
+ </div>
+ </div>
+</div>
+
+<script>
+ const searchConfig = {
+ path : "/search.xml",
+ top_n_per_article: "1",
+ unescape : "false",
+ trigger: "auto",
+ preload: "false"
+ }
+</script>
+<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/search.js"></script>
+<script src="/js/search.js"></script>
+
+
+
+ </body>
+</html>
diff --git a/archives/2025/03/index.html b/archives/2025/03/index.html
index 4f18a3f0..cc9b710a 100644
--- a/archives/2025/03/index.html
+++ b/archives/2025/03/index.html
@@ -145,6 +145,24 @@
<div class="post-list-item">
<div class="post-title">
+ <a href="/2025/03/31/%E5%9C%A8F-%E4%B8%AD%E5%A4%84%E7%90%86%E5%A4%8D%E6%9D%82%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5%E7%9A%84%E5%AE%9E%E8%B7%B5%E6%8C%87%E5%8D%97/">
+
+ 在F#中处理复杂依赖注入的实践指南
+
+ </a>
+ </div>
+
+ <span class="post-date">Mar 31, 2025</span>
+ </div>
+
+
+
+
+
+
+
+ <div class="post-list-item">
+ <div class="post-title">
<a href="/2025/03/30/F-%E9%87%8D%E8%BD%BD%E8%A7%A3%E6%9E%90%E9%97%AE%E9%A2%98/">
F# 重载解析问题
diff --git a/archives/2025/index.html b/archives/2025/index.html
index 920651b0..9247cc29 100644
--- a/archives/2025/index.html
+++ b/archives/2025/index.html
@@ -145,6 +145,24 @@
<div class="post-list-item">
<div class="post-title">
+ <a href="/2025/03/31/%E5%9C%A8F-%E4%B8%AD%E5%A4%84%E7%90%86%E5%A4%8D%E6%9D%82%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5%E7%9A%84%E5%AE%9E%E8%B7%B5%E6%8C%87%E5%8D%97/">
+
+ 在F#中处理复杂依赖注入的实践指南
+
+ </a>
+ </div>
+
+ <span class="post-date">Mar 31, 2025</span>
+ </div>
+
+
+
+
+
+
+
+ <div class="post-list-item">
+ <div class="post-title">
<a href="/2025/03/30/F-%E9%87%8D%E8%BD%BD%E8%A7%A3%E6%9E%90%E9%97%AE%E9%A2%98/">
F# 重载解析问题
@@ -300,24 +318,6 @@
</div>
-
-
-
-
-
- <div class="post-list-item">
- <div class="post-title">
- <a href="/2025/02/19/Repository-pattern-in-Typescript/">
-
- Repository pattern in Typescript
-
- </a>
- </div>
-
- <span class="post-date">Feb 19, 2025</span>
- </div>
-
-
<div id="paginator">
<div class=paginator>
diff --git a/archives/2025/page/2/index.html b/archives/2025/page/2/index.html
index 9e287956..7a7a1a9d 100644
--- a/archives/2025/page/2/index.html
+++ b/archives/2025/page/2/index.html
@@ -145,6 +145,24 @@
<div class="post-list-item">
<div class="post-title">
+ <a href="/2025/02/19/Repository-pattern-in-Typescript/">
+
+ Repository pattern in Typescript
+
+ </a>
+ </div>
+
+ <span class="post-date">Feb 19, 2025</span>
+ </div>
+
+
+
+
+
+
+
+ <div class="post-list-item">
+ <div class="post-title">
<a href="/2025/02/18/Prisma-%E5%85%B3%E7%B3%BB%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84-Self-relations/">
Prisma 关系型数据库的 Self-relations
diff --git a/archives/index.html b/archives/index.html
index c8ec1895..04ec7de6 100644
--- a/archives/index.html
+++ b/archives/index.html
@@ -145,6 +145,24 @@
<div class="post-list-item">
<div class="post-title">
+ <a href="/2025/03/31/%E5%9C%A8F-%E4%B8%AD%E5%A4%84%E7%90%86%E5%A4%8D%E6%9D%82%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5%E7%9A%84%E5%AE%9E%E8%B7%B5%E6%8C%87%E5%8D%97/">
+
+ 在F#中处理复杂依赖注入的实践指南
+
+ </a>
+ </div>
+
+ <span class="post-date">Mar 31, 2025</span>
+ </div>
+
+
+
+
+
+
+
+ <div class="post-list-item">
+ <div class="post-title">
<a href="/2025/03/30/F-%E9%87%8D%E8%BD%BD%E8%A7%A3%E6%9E%90%E9%97%AE%E9%A2%98/">
F# 重载解析问题
@@ -300,24 +318,6 @@
</div>
-
-
-
-
-
- <div class="post-list-item">
- <div class="post-title">
- <a href="/2025/02/19/Repository-pattern-in-Typescript/">
-
- Repository pattern in Typescript
-
- </a>
- </div>
-
- <span class="post-date">Feb 19, 2025</span>
- </div>
-
-
<div id="paginator">
<div class=paginator>
diff --git a/archives/page/10/index.html b/archives/page/10/index.html
index d7063aae..298199a0 100644
--- a/archives/page/10/index.html
+++ b/archives/page/10/index.html
@@ -145,6 +145,24 @@
<div class="post-list-item">
<div class="post-title">
+ <a href="/2023/05/01/Rust-%E8%99%9A%E8%A1%A8%E5%B8%83%E5%B1%80%E8%A7%84%E5%88%99%E4%BB%8B%E7%BB%8D/">
+
+ Rust 虚表布局规则介绍
+
+ </a>
+ </div>
+
+ <span class="post-date">May 1, 2023</span>
+ </div>
+
+
+
+
+
+
+
+ <div class="post-list-item">
+ <div class="post-title">
<a href="/2023/04/30/TypeScript-With-Rust-Errors-No-Try-Catch-Heresy/">
TypeScript With Rust Errors, No Try Catch, Heresy
@@ -300,24 +318,6 @@
</div>
-
-
-
-
-
- <div class="post-list-item">
- <div class="post-title">
- <a href="/2023/03/01/%E7%BA%AF%E7%89%9B%E5%A5%B6%E5%8F%AF%E4%BB%A5%E5%8A%A0%E7%82%B9%E5%95%A5/">
-
- 纯牛奶可以加点啥
-
- </a>
- </div>
-
- <span class="post-date">Mar 1, 2023</span>
- </div>
-
-
<div id="paginator">
<div class=paginator>
diff --git a/archives/page/11/index.html b/archives/page/11/index.html
index 9beb0bcd..04fbdb79 100644
--- a/archives/page/11/index.html
+++ b/archives/page/11/index.html
@@ -145,6 +145,24 @@
<div class="post-list-item">
<div class="post-title">
+ <a href="/2023/03/01/%E7%BA%AF%E7%89%9B%E5%A5%B6%E5%8F%AF%E4%BB%A5%E5%8A%A0%E7%82%B9%E5%95%A5/">
+
+ 纯牛奶可以加点啥
+
+ </a>
+ </div>
+
+ <span class="post-date">Mar 1, 2023</span>
+ </div>
+
+
+
+
+
+
+
+ <div class="post-list-item">
+ <div class="post-title">
<a href="/2023/02/26/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E5%85%AD%E6%97%A5/">
二零二三年二月二十六日
@@ -302,24 +320,6 @@
</div>
-
-
-
-
-
- <div class="post-list-item">
- <div class="post-title">
- <a href="/2022/10/01/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%BA%8C%E5%B9%B4%E5%8D%81%E6%9C%88%E4%B8%80%E6%97%A5/">
-
- 二零二二年十月一日
-
- </a>
- </div>
-
- <span class="post-date">Oct 1, 2022</span>
- </div>
-
-
<div id="paginator">
<div class=paginator>
diff --git a/archives/page/12/index.html b/archives/page/12/index.html
index 1342c35f..4c4718f9 100644
--- a/archives/page/12/index.html
+++ b/archives/page/12/index.html
@@ -145,6 +145,24 @@
<div class="post-list-item">
<div class="post-title">
+ <a href="/2022/10/01/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%BA%8C%E5%B9%B4%E5%8D%81%E6%9C%88%E4%B8%80%E6%97%A5/">
+
+ 二零二二年十月一日
+
+ </a>
+ </div>
+
+ <span class="post-date">Oct 1, 2022</span>
+ </div>
+
+
+
+
+
+
+
+ <div class="post-list-item">
+ <div class="post-title">
<a href="/2022/09/22/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%BA%8C%E5%B9%B4%E4%B9%9D%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%8C%E6%97%A5/">
二零二二年九月二十二日
@@ -304,24 +322,6 @@
</div>
-
-
-
-
-
- <div class="post-list-item">
- <div class="post-title">
- <a href="/2020/12/09/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E9%9B%B6%E5%B9%B4%E5%8D%81%E4%BA%8C%E6%9C%88%E4%B9%9D%E6%97%A5/">
-
- 二零二零年十二月九日
-
- </a>
- </div>
-
- <span class="post-date">Dec 9, 2020</span>
- </div>
-
-
<div id="paginator">
<div class=paginator>
diff --git a/archives/page/13/index.html b/archives/page/13/index.html
index 943e5810..100c8d67 100644
--- a/archives/page/13/index.html
+++ b/archives/page/13/index.html
@@ -145,6 +145,24 @@
<div class="post-list-item">
<div class="post-title">
+ <a href="/2020/12/09/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E9%9B%B6%E5%B9%B4%E5%8D%81%E4%BA%8C%E6%9C%88%E4%B9%9D%E6%97%A5/">
+
+ 二零二零年十二月九日
+
+ </a>
+ </div>
+
+ <span class="post-date">Dec 9, 2020</span>
+ </div>
+
+
+
+
+
+
+
+ <div class="post-list-item">
+ <div class="post-title">
<a href="/2020/12/08/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E9%9B%B6%E5%B9%B4%E5%8D%81%E4%BA%8C%E6%9C%88%E5%85%AB%E6%97%A5/">
二零二零年十二月八日
diff --git a/archives/page/2/index.html b/archives/page/2/index.html
index cae3f12e..e9ff33f5 100644
--- a/archives/page/2/index.html
+++ b/archives/page/2/index.html
@@ -145,6 +145,24 @@
<div class="post-list-item">
<div class="post-title">
+ <a href="/2025/02/19/Repository-pattern-in-Typescript/">
+
+ Repository pattern in Typescript
+
+ </a>
+ </div>
+
+ <span class="post-date">Feb 19, 2025</span>
+ </div>
+
+
+
+
+
+
+
+ <div class="post-list-item">
+ <div class="post-title">
<a href="/2025/02/18/Prisma-%E5%85%B3%E7%B3%BB%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84-Self-relations/">
Prisma 关系型数据库的 Self-relations
@@ -302,24 +320,6 @@
</div>
-
-
-
-
-
- <div class="post-list-item">
- <div class="post-title">
- <a href="/2024/10/18/10-Tips-for-Productive-FSharp-Scripting/">
-
- 10 Tips for Productive FSharp Scripting
-
- </a>
- </div>
-
- <span class="post-date">Oct 18, 2024</span>
- </div>
-
-
<div id="paginator">
<div class=paginator>
diff --git a/archives/page/3/index.html b/archives/page/3/index.html
index a8df46d7..18d9c5a7 100644
--- a/archives/page/3/index.html
+++ b/archives/page/3/index.html
@@ -145,6 +145,24 @@
<div class="post-list-item">
<div class="post-title">
+ <a href="/2024/10/18/10-Tips-for-Productive-FSharp-Scripting/">
+
+ 10 Tips for Productive FSharp Scripting
+
+ </a>
+ </div>
+
+ <span class="post-date">Oct 18, 2024</span>
+ </div>
+
+
+
+
+
+
+
+ <div class="post-list-item">
+ <div class="post-title">
<a href="/2024/10/18/Building-custom-fibers-library-in-FSharp/">
Building custom fibers library in FSharp
@@ -300,24 +318,6 @@
</div>
-
-
-
-
-
- <div class="post-list-item">
- <div class="post-title">
- <a href="/2024/09/07/%E7%BB%99%E5%AD%A9%E5%AD%90%E4%BB%AC%E7%9A%84%E8%AF%9D/">
-
- 什么玩意儿都是
-
- </a>
- </div>
-
- <span class="post-date">Sep 7, 2024</span>
- </div>
-
-
<div id="paginator">
<div class=paginator>
diff --git a/archives/page/4/index.html b/archives/page/4/index.html
index 70176d5d..c7eb68c3 100644
--- a/archives/page/4/index.html
+++ b/archives/page/4/index.html
@@ -145,6 +145,24 @@
<div class="post-list-item">
<div class="post-title">
+ <a href="/2024/09/07/%E7%BB%99%E5%AD%A9%E5%AD%90%E4%BB%AC%E7%9A%84%E8%AF%9D/">
+
+ 什么玩意儿都是
+
+ </a>
+ </div>
+
+ <span class="post-date">Sep 7, 2024</span>
+ </div>
+
+
+
+
+
+
+
+ <div class="post-list-item">
+ <div class="post-title">
<a href="/2024/09/01/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E4%B9%9D%E6%9C%88%E4%B8%80%E6%97%A5/">
二〇二四年九月一日
@@ -300,24 +318,6 @@
</div>
-
-
-
-
-
- <div class="post-list-item">
- <div class="post-title">
- <a href="/2024/06/06/NET-AOT-%E4%B8%8B%E7%9A%84-F-%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0%E8%A7%A3%E6%9E%90%E5%BA%93%E9%80%89%E6%8B%A9/">
-
- .NET AOT 下的 F# 命令行参数解析库选择
-
- </a>
- </div>
-
- <span class="post-date">Jun 6, 2024</span>
- </div>
-
-
<div id="paginator">
<div class=paginator>
diff --git a/archives/page/5/index.html b/archives/page/5/index.html
index 3bbd37bc..29419e15 100644
--- a/archives/page/5/index.html
+++ b/archives/page/5/index.html
@@ -145,6 +145,24 @@
<div class="post-list-item">
<div class="post-title">
+ <a href="/2024/06/06/NET-AOT-%E4%B8%8B%E7%9A%84-F-%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0%E8%A7%A3%E6%9E%90%E5%BA%93%E9%80%89%E6%8B%A9/">
+
+ .NET AOT 下的 F# 命令行参数解析库选择
+
+ </a>
+ </div>
+
+ <span class="post-date">Jun 6, 2024</span>
+ </div>
+
+
+
+
+
+
+
+ <div class="post-list-item">
+ <div class="post-title">
<a href="/2024/05/20/Rescript-genType-import-%E9%97%AE%E9%A2%98/">
Rescript @genType import 问题
@@ -300,24 +318,6 @@
</div>
-
-
-
-
-
- <div class="post-list-item">
- <div class="post-title">
- <a href="/2024/01/25/%E6%80%A5%E8%AF%8A%E4%B8%8E%E7%81%BE%E9%9A%BE%E5%8C%BB%E5%AD%A6-%E7%83%A7%E4%BC%A4/">
-
- 急诊与灾难医学--烧伤
-
- </a>
- </div>
-
- <span class="post-date">Jan 25, 2024</span>
- </div>
-
-
<div id="paginator">
<div class=paginator>
diff --git a/archives/page/6/index.html b/archives/page/6/index.html
index db8a2e95..e291cb8a 100644
--- a/archives/page/6/index.html
+++ b/archives/page/6/index.html
@@ -145,6 +145,24 @@
<div class="post-list-item">
<div class="post-title">
+ <a href="/2024/01/25/%E6%80%A5%E8%AF%8A%E4%B8%8E%E7%81%BE%E9%9A%BE%E5%8C%BB%E5%AD%A6-%E7%83%A7%E4%BC%A4/">
+
+ 急诊与灾难医学--烧伤
+
+ </a>
+ </div>
+
+ <span class="post-date">Jan 25, 2024</span>
+ </div>
+
+
+
+
+
+
+
+ <div class="post-list-item">
+ <div class="post-title">
<a href="/2024/01/23/G-Machine/">
G-Machine
@@ -302,24 +320,6 @@
</div>
-
-
-
-
-
- <div class="post-list-item">
- <div class="post-title">
- <a href="/2023/11/21/Adolescent-Onset-of-Acute-Heart-Failure/">
-
- Adolescent Onset of Acute Heart Failure
-
- </a>
- </div>
-
- <span class="post-date">Nov 21, 2023</span>
- </div>
-
-
<div id="paginator">
<div class=paginator>
diff --git a/archives/page/7/index.html b/archives/page/7/index.html
index 77dd211b..4610faf7 100644
--- a/archives/page/7/index.html
+++ b/archives/page/7/index.html
@@ -145,6 +145,24 @@
<div class="post-list-item">
<div class="post-title">
+ <a href="/2023/11/21/Adolescent-Onset-of-Acute-Heart-Failure/">
+
+ Adolescent Onset of Acute Heart Failure
+
+ </a>
+ </div>
+
+ <span class="post-date">Nov 21, 2023</span>
+ </div>
+
+
+
+
+
+
+
+ <div class="post-list-item">
+ <div class="post-title">
<a href="/2023/11/16/Fever-of-Unknown-Origin/">
Fever of Unknown Origin
@@ -300,24 +318,6 @@
</div>
-
-
-
-
-
- <div class="post-list-item">
- <div class="post-title">
- <a href="/2023/10/12/%E8%BF%87%E5%BA%A6%E7%96%B2%E5%8A%B3%E7%9A%84%E5%85%AD%E7%A7%8D%E8%A1%A8%E7%8E%B0/">
-
- 过度疲劳的六种表现
-
- </a>
- </div>
-
- <span class="post-date">Oct 12, 2023</span>
- </div>
-
-
<div id="paginator">
<div class=paginator>
diff --git a/archives/page/8/index.html b/archives/page/8/index.html
index 95d41f59..34dbf781 100644
--- a/archives/page/8/index.html
+++ b/archives/page/8/index.html
@@ -145,6 +145,24 @@
<div class="post-list-item">
<div class="post-title">
+ <a href="/2023/10/12/%E8%BF%87%E5%BA%A6%E7%96%B2%E5%8A%B3%E7%9A%84%E5%85%AD%E7%A7%8D%E8%A1%A8%E7%8E%B0/">
+
+ 过度疲劳的六种表现
+
+ </a>
+ </div>
+
+ <span class="post-date">Oct 12, 2023</span>
+ </div>
+
+
+
+
+
+
+
+ <div class="post-list-item">
+ <div class="post-title">
<a href="/2023/10/05/v8%E4%B8%AD%E7%9A%84Number-toString/">
v8中的Number.toString()
@@ -300,24 +318,6 @@
</div>
-
-
-
-
-
- <div class="post-list-item">
- <div class="post-title">
- <a href="/2023/07/21/WiscKey-Separating-Keys-from-Values-in-SSD-conscious-Storage/">
-
- WiscKey: Separating Keys from Values in SSD-conscious Storage
-
- </a>
- </div>
-
- <span class="post-date">Jul 21, 2023</span>
- </div>
-
-
<div id="paginator">
<div class=paginator>
diff --git a/archives/page/9/index.html b/archives/page/9/index.html
index 3337aa2a..b2ce4981 100644
--- a/archives/page/9/index.html
+++ b/archives/page/9/index.html
@@ -145,6 +145,24 @@
<div class="post-list-item">
<div class="post-title">
+ <a href="/2023/07/21/WiscKey-Separating-Keys-from-Values-in-SSD-conscious-Storage/">
+
+ WiscKey: Separating Keys from Values in SSD-conscious Storage
+
+ </a>
+ </div>
+
+ <span class="post-date">Jul 21, 2023</span>
+ </div>
+
+
+
+
+
+
+
+ <div class="post-list-item">
+ <div class="post-title">
<a href="/2023/06/29/%E4%BA%8C%E3%80%87%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%85%AD%E6%9C%88%E4%BA%8C%E5%8D%81%E4%B9%9D%E6%97%A5/">
二〇二三年六月二十九日
@@ -300,24 +318,6 @@
</div>
-
-
-
-
-
- <div class="post-list-item">
- <div class="post-title">
- <a href="/2023/05/01/Rust-%E8%99%9A%E8%A1%A8%E5%B8%83%E5%B1%80%E8%A7%84%E5%88%99%E4%BB%8B%E7%BB%8D/">
-
- Rust 虚表布局规则介绍
-
- </a>
- </div>
-
- <span class="post-date">May 1, 2023</span>
- </div>
-
-
<div id="paginator">
<div class=paginator>
diff --git a/search.xml b/search.xml
index b530c5e0..b23982ff 100644
--- a/search.xml
+++ b/search.xml
@@ -3381,6 +3381,66 @@
</tags>
</entry>
<entry>
+ <title>在F#中处理复杂依赖注入的实践指南</title>
+ <url>/2025/03/31/%E5%9C%A8F-%E4%B8%AD%E5%A4%84%E7%90%86%E5%A4%8D%E6%9D%82%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5%E7%9A%84%E5%AE%9E%E8%B7%B5%E6%8C%87%E5%8D%97/</url>
+ <content><![CDATA[<p>以下是基于用户提供的文章内容的详细解读博客文章,结合了相关引用资源以增强内容深度:</p>
+<hr>
+<h1 id="在F-中处理复杂依赖注入的实践指南"><a href="#在F-中处理复杂依赖注入的实践指南" class="headerlink" title="在F#中处理复杂依赖注入的实践指南"></a>在F#中处理复杂依赖注入的实践指南</h1><p>依赖注入(DI)是构建松耦合、可维护系统的核心模式。在面向对象语言中,DI框架(如Spring)通过反射和容器管理依赖关系。在 F# 中,则更倾向于利用语言特性(如 Partial Application 和 Type Inference)实现依赖管理。</p>
+<hr>
+<h2 id="一、传统方法:Partial-Application"><a href="#一、传统方法:Partial-Application" class="headerlink" title="一、传统方法:Partial Application"></a>一、传统方法:Partial Application</h2><p>在函数式编程中,Partial Application 是传递依赖的常用方式。例如:</p>
+<figure class="highlight fsharp"><table><tr><td class="code"><pre><span class="line"><span class="keyword">let</span> foo bar baz request <span class="operator">=</span> <span class="operator">...</span></span><br><span class="line"><span class="keyword">let</span> wired <span class="operator">=</span> foo dependency1 dependency2</span><br><span class="line"><span class="keyword">let</span> response <span class="operator">=</span> wired request</span><br></pre></td></tr></table></figure>
+
+<p><strong>优点</strong>: </p>
+<ul>
+<li>无需框架或反射,直接通过函数参数传递依赖。 </li>
+<li>符合函数式编程的纯函数理念。</li>
+</ul>
+<p><strong>缺点</strong>: </p>
+<ol>
+<li><strong>参数爆炸</strong>:当功能扩展时,参数数量激增(如日志、数据库、加密等)。 </li>
+<li><strong>维护困难</strong>:新增依赖需修改所有调用点的参数传递。 </li>
+<li><strong>隐式依赖</strong>:难以从函数签名直接区分核心参数与辅助依赖。</li>
+</ol>
+<hr>
+<h2 id="二、结构化方法:单一环境参数(env)"><a href="#二、结构化方法:单一环境参数(env)" class="headerlink" title="二、结构化方法:单一环境参数(env)"></a>二、结构化方法:单一环境参数(<code>env</code>)</h2><p>为解决参数爆炸问题,可将依赖封装为单一环境对象<code>env</code>,并通过接口约束访问权限:</p>
+<figure class="highlight fsharp"><table><tr><td class="code"><pre><span class="line"><span class="meta">[&lt;Interface&gt;]</span> <span class="keyword">type</span> <span class="title class_">ILog</span> <span class="operator">=</span> <span class="keyword">abstract</span> Logger<span class="operator">:</span> ILogger</span><br><span class="line"><span class="meta">[&lt;Interface&gt;]</span> <span class="keyword">type</span> <span class="title class_">IDb</span> <span class="operator">=</span> <span class="keyword">abstract</span> Database<span class="operator">:</span> IDatabase</span><br><span class="line"></span><br><span class="line"><span class="keyword">module</span> Log <span class="operator">=</span></span><br><span class="line"> <span class="keyword">let</span> info (env<span class="operator">:</span> #ILog) <span class="operator">=</span> env.Logger.Info(<span class="string">&quot;Message&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">module</span> Db <span class="operator">=</span></span><br><span class="line"> <span class="keyword">let</span> fetchUser (env<span class="operator">:</span> #IDb) <span class="operator">=</span> env.Database.Query(<span class="operator">...</span>)</span><br></pre></td></tr></table></figure>
+
+<p><strong>优点</strong>: </p>
+<ul>
+<li><strong>显式依赖声明</strong>:函数签名仅需<code>env</code>参数,编译器验证接口实现。 </li>
+<li><strong>模块化隔离</strong>:各模块仅声明所需接口(如<code>ILog</code>、<code>IDb</code>),避免全局依赖。 </li>
+<li><strong>易于测试</strong>:通过模拟<code>env</code>实现单元测试,无需依赖具体实现。</li>
+</ul>
+<p><strong>应用场景</strong>: </p>
+<figure class="highlight fsharp"><table><tr><td class="code"><pre><span class="line"><span class="keyword">let</span> changePass env req <span class="operator">=</span> <span class="keyword">task</span> &#123;</span><br><span class="line"> <span class="keyword">let!</span> user <span class="operator">=</span> Db.fetchUser env req.UserId</span><br><span class="line"> Log.info env <span class="string">&quot;Processing user: %i&quot;</span> user.Id</span><br><span class="line"> <span class="operator">...</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
+
+<hr>
+<h2 id="三、Reader-Monad"><a href="#三、Reader-Monad" class="headerlink" title="三、Reader Monad"></a>三、Reader Monad</h2><p>为消除显式的<code>env</code>传递,可引入 Reader Monad,将环境隐式注入计算流程:</p>
+<figure class="highlight fsharp"><table><tr><td class="code"><pre><span class="line"><span class="meta">[&lt;Struct&gt;]</span> <span class="keyword">type</span> <span class="title class_">Effect</span><span class="operator">&lt;</span><span class="symbol">&#x27;env</span>, <span class="symbol">&#x27;out</span><span class="operator">&gt;</span> <span class="operator">=</span> Effect <span class="keyword">of</span> (<span class="symbol">&#x27;env</span> <span class="operator">-&gt;</span> <span class="symbol">&#x27;out</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">module</span> Effect <span class="operator">=</span></span><br><span class="line"> <span class="keyword">let</span> run env (Effect fn) <span class="operator">=</span> fn env</span><br><span class="line"> <span class="keyword">let</span> bind f effect <span class="operator">=</span> Effect (<span class="keyword">fun</span> env <span class="operator">-&gt;</span> run env (f (run env effect)))</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> <span class="title class_">EffectBuilder</span>() <span class="operator">=</span></span><br><span class="line"> <span class="keyword">member</span> __.Bind(e, f) <span class="operator">=</span> Effect.bind f e</span><br><span class="line"> <span class="keyword">member</span> __.Return(x) <span class="operator">=</span> Effect (<span class="keyword">fun</span> _ <span class="operator">-&gt;</span> x)</span><br><span class="line"></span><br><span class="line"><span class="keyword">let</span> effect <span class="operator">=</span> EffectBuilder()</span><br></pre></td></tr></table></figure>
+
+<p>然后:</p>
+<figure class="highlight fsharp"><table><tr><td class="code"><pre><span class="line"><span class="keyword">let</span> changePass req <span class="operator">=</span> <span class="keyword">effect</span> &#123;</span><br><span class="line"> <span class="keyword">let!</span> user <span class="operator">=</span> Db.fetchUser req.UserId</span><br><span class="line"> <span class="keyword">let!</span> salt <span class="operator">=</span> Random.bytes <span class="number">32</span></span><br><span class="line"> <span class="keyword">do!</span> Log.info <span class="string">&quot;Password updated for user %i&quot;</span> user.Id</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">Ok</span>()</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
+
+<p><strong>优点</strong>: </p>
+<ul>
+<li><strong>隐式依赖管理</strong>:通过<code>effect</code>计算表达式自动传递<code>env</code>,减少样板代码。 </li>
+<li><strong>组合性</strong>:支持与其他计算表达式(如<code>async</code>&#x2F;<code>task</code>)结合,处理异步操作。</li>
+</ul>
+<p><strong>缺点</strong>: </p>
+<ul>
+<li><strong>性能开销</strong>:频繁的闭包创建和间接调用可能导致性能下降。 </li>
+<li><strong>生态兼容性</strong>:需自定义计算表达式,与现有异步框架集成复杂。</li>
+</ul>
+<h2 id="Refs"><a href="#Refs" class="headerlink" title="Refs."></a>Refs.</h2><ul>
+<li>Spring的构造器注入</li>
+<li>Blazor的DI实现</li>
+</ul>
+]]></content>
+ <tags>
+ <tag>Technique</tag>
+ </tags>
+ </entry>
+ <entry>
<title>奥司他韦</title>
<url>/2023/03/05/%E5%A5%A5%E5%8F%B8%E4%BB%96%E9%9F%A6/</url>
<content><![CDATA[<p><img src="/img/%E5%8C%BB%E5%AD%A6/%E5%A5%A5%E5%8F%B8%E4%BB%96%E9%9F%A6.jpg" alt="奥司他韦.jpg"></p>
diff --git a/tags/Technique/index.html b/tags/Technique/index.html
index d843fbe0..2a98a9bb 100644
--- a/tags/Technique/index.html
+++ b/tags/Technique/index.html
@@ -152,6 +152,24 @@
<div class="post-list-item">
<div class="post-title">
+ <a href="/2025/03/31/%E5%9C%A8F-%E4%B8%AD%E5%A4%84%E7%90%86%E5%A4%8D%E6%9D%82%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5%E7%9A%84%E5%AE%9E%E8%B7%B5%E6%8C%87%E5%8D%97/">
+
+ 在F#中处理复杂依赖注入的实践指南
+
+ </a>
+ </div>
+
+ <span class="post-date">Mar 31, 2025</span>
+ </div>
+
+
+
+
+
+
+
+ <div class="post-list-item">
+ <div class="post-title">
<a href="/2025/03/30/F-%E9%87%8D%E8%BD%BD%E8%A7%A3%E6%9E%90%E9%97%AE%E9%A2%98/">
F# 重载解析问题
@@ -307,24 +325,6 @@
</div>
-
-
-
-
-
- <div class="post-list-item">
- <div class="post-title">
- <a href="/2025/02/10/%E5%AE%9E%E6%97%B6%E6%90%9C%E7%B4%A2%E4%B8%AD%E7%9A%84%E9%98%B2%E6%8A%96%E5%87%BD%E6%95%B0/">
-
- 实时搜索中的防抖函数
-
- </a>
- </div>
-
- <span class="post-date">Feb 10, 2025</span>
- </div>
-
-
<div id="paginator">
<div class=paginator>
diff --git a/tags/Technique/page/2/index.html b/tags/Technique/page/2/index.html
index a4ec25bc..614e0df7 100644
--- a/tags/Technique/page/2/index.html
+++ b/tags/Technique/page/2/index.html
@@ -147,6 +147,26 @@
+ <div class="year-title">2025</div>
+
+
+ <div class="post-list-item">
+ <div class="post-title">
+ <a href="/2025/02/10/%E5%AE%9E%E6%97%B6%E6%90%9C%E7%B4%A2%E4%B8%AD%E7%9A%84%E9%98%B2%E6%8A%96%E5%87%BD%E6%95%B0/">
+
+ 实时搜索中的防抖函数
+
+ </a>
+ </div>
+
+ <span class="post-date">Feb 10, 2025</span>
+ </div>
+
+
+
+
+
+
<div class="year-title">2024</div>
@@ -307,24 +327,6 @@
</div>
-
-
-
-
-
- <div class="post-list-item">
- <div class="post-title">
- <a href="/2024/07/01/OCaml-News-2024-4/">
-
- OCaml News 2024-4
-
- </a>
- </div>
-
- <span class="post-date">Jul 1, 2024</span>
- </div>
-
-
<div id="paginator">
<div class=paginator>
diff --git a/tags/Technique/page/3/index.html b/tags/Technique/page/3/index.html
index 30cb14dd..f6079531 100644
--- a/tags/Technique/page/3/index.html
+++ b/tags/Technique/page/3/index.html
@@ -152,6 +152,24 @@
<div class="post-list-item">
<div class="post-title">
+ <a href="/2024/07/01/OCaml-News-2024-4/">
+
+ OCaml News 2024-4
+
+ </a>
+ </div>
+
+ <span class="post-date">Jul 1, 2024</span>
+ </div>
+
+
+
+
+
+
+
+ <div class="post-list-item">
+ <div class="post-title">
<a href="/2024/06/27/OCaml-News-2024-5/">
OCaml News 2024-5
@@ -307,26 +325,6 @@
</div>
-
-
-
-
- <div class="year-title">2023</div>
-
-
- <div class="post-list-item">
- <div class="post-title">
- <a href="/2023/10/21/OCaml-Core-Int-pow-%E7%9A%84%E5%AE%9E%E7%8E%B0/">
-
- OCaml Core.Int.pow 的实现
-
- </a>
- </div>
-
- <span class="post-date">Oct 21, 2023</span>
- </div>
-
-
<div id="paginator">
<div class=paginator>
diff --git a/tags/Technique/page/4/index.html b/tags/Technique/page/4/index.html
index 0b4b99ec..e982b92c 100644
--- a/tags/Technique/page/4/index.html
+++ b/tags/Technique/page/4/index.html
@@ -152,6 +152,24 @@
<div class="post-list-item">
<div class="post-title">
+ <a href="/2023/10/21/OCaml-Core-Int-pow-%E7%9A%84%E5%AE%9E%E7%8E%B0/">
+
+ OCaml Core.Int.pow 的实现
+
+ </a>
+ </div>
+
+ <span class="post-date">Oct 21, 2023</span>
+ </div>
+
+
+
+
+
+
+
+ <div class="post-list-item">
+ <div class="post-title">
<a href="/2023/10/05/v8%E4%B8%AD%E7%9A%84Number-toString/">
v8中的Number.toString()
@@ -307,24 +325,6 @@
</div>
-
-
-
-
-
- <div class="post-list-item">
- <div class="post-title">
- <a href="/2023/05/02/Rust-Partial-%E8%AF%AD%E4%B9%89/">
-
- Rust Partial 语义
-
- </a>
- </div>
-
- <span class="post-date">May 2, 2023</span>
- </div>
-
-
<div id="paginator">
<div class=paginator>
diff --git a/tags/Technique/page/5/index.html b/tags/Technique/page/5/index.html
index e8404f63..09b398ae 100644
--- a/tags/Technique/page/5/index.html
+++ b/tags/Technique/page/5/index.html
@@ -152,6 +152,24 @@
<div class="post-list-item">
<div class="post-title">
+ <a href="/2023/05/02/Rust-Partial-%E8%AF%AD%E4%B9%89/">
+
+ Rust Partial 语义
+
+ </a>
+ </div>
+
+ <span class="post-date">May 2, 2023</span>
+ </div>
+
+
+
+
+
+
+
+ <div class="post-list-item">
+ <div class="post-title">
<a href="/2023/05/01/Rust-%E8%99%9A%E8%A1%A8%E5%B8%83%E5%B1%80%E8%A7%84%E5%88%99%E4%BB%8B%E7%BB%8D/">
Rust 虚表布局规则介绍