摘要: 最近在写goroutine碰到了常见错误 for _, val := range values { go func() { fmt.Println(val) }() } 在这里,实际结果并不是预期的所有值都输出一遍(而是出现data race),FAQ里给出了两种解决方案: // 方案1 for _ 阅读全文
posted @ 2023-01-02 20:39 Christophe1997 阅读(134) 评论(0) 推荐(0) 编辑
摘要: 近来想于函数式编程中寻找类似与双向链表的数据结构, 结果找到了Zipper. Zipper中文为拉链, 泛指一类常在函数式编程中使用的聚合数据结构, 其加强了原有的数据结构, 使得能够遍历或更新原有数据结构的任意部分. zipper的关键思想是将目前需要处理的部分和不需要处理的部分分开, 同时保存目 阅读全文
posted @ 2021-03-30 14:58 Christophe1997 阅读(220) 评论(0) 推荐(0) 编辑
摘要: Value Restriction是什么? Value restriction是用于控制类型推断能否对值声明进行多态泛化的规则(MLton原文:“The value restriction is a rule that governs when type inference is allowed t 阅读全文
posted @ 2021-03-30 14:58 Christophe1997 阅读(292) 评论(0) 推荐(0) 编辑
摘要: Pearl 1: 给定一个自然数的有限集X, 计算不属于X的最小自然数. X表示为不包含重复元素的无序列表. 时间复杂度要求$O(n)$. Type: minfree :: [Int] -> Int(也可以额外的定义自然数类型, 不过这不是我们的重点) "Pearls of Functional A 阅读全文
posted @ 2021-03-29 00:25 Christophe1997 阅读(49) 评论(0) 推荐(0) 编辑
摘要: Pearl 2: 给定一个长度大于1的列表, 计算其元素的最大surpasser count, 要求算法复杂度$O(n log n)$. Type: msc: Ord a => [a] -> Int "Pearls of functional algorithm design"的第二章, 我们先来看 阅读全文
posted @ 2021-03-29 00:17 Christophe1997 阅读(54) 评论(0) 推荐(0) 编辑
摘要: Memoization是动态规划(Dynamic Programming)中自顶向下处理问题采用的策略, 其基本想法是通过将子问题的解保存起来避免重复计算来优化算法. 这个概念本身很简单, 在其他有明显mutable语义的语言中, 实现起来也非常简单. 但是在Haskell中问题就变的复杂了不少, 阅读全文
posted @ 2021-03-27 16:27 Christophe1997 阅读(259) 评论(0) 推荐(0) 编辑
摘要: 之前在"Essentials of Programming Languages"中学习过CPS(Continuation Passing Style), 而笔记在blog改版后被丢弃, 故在这篇文章中重新详细的探讨下CPS以及尾递归, 就当是温故而知新. Continuation 在理解什么是"Co 阅读全文
posted @ 2021-03-27 13:29 Christophe1997 阅读(401) 评论(0) 推荐(0) 编辑