阅读关于商类型及其在函数式编程中的使用,我发现了这篇文章.作者提到Data.Set了一个模块的例子,它提供了大量需要访问模块内部的功能:
Data.Set有36个函数,当真正需要确保一个集合的意义("这些元素是不同的")时,toList和fromList.
作者的观点似乎是,如果我们忘记了一些只能使用模块内部有效实现的功能,我们需要"打开模块并打破抽象".
然后他说
我们可以用商型来缓解所有这些混乱局面.
但没有解释这个说法.
所以我的问题是:商如何帮助这里?
编辑
我做了一些研究,发现了一篇论文"构建具有商数类型的多态程序".它详细阐述了容器的容器,并在摘要和引言中提到了"有效"这个词.但是如果我没有误读,它就没有给出任何有效表示"隐藏"商容器的例子.
编辑2
多一点表现在"[PDF]在同伦理论型编程"的文件在第3章,作为一个依赖和使用商类型可以实现的事实.引入了关于抽象类型的视图(看起来与类型类非常相似),并提供了一些相关的Agda代码.然而本章的重点是关于抽象类型的推理,所以我不确定这与我的问题有什么关系.
在我正在处理的项目中,我们经常defsomething为不同的目的定义自定义样式的宏来隐藏样板。一个例子是defhook帮助定义一个事件的钩子处理程序。这是它的一个简化版本(实际版本有更多参数并在 中做了一些重要的事情defmethod,但这与我的问题无关):
(defmulti handle-hook
"This multimethod is called when an event was fired."
(fn [event context] event))
(defmacro defhook
"Define a hook for an event."
[event docstring & more]
`(let [body# (fn ~@more)]
(defmethod handle-hook ~event [event# context#]
(body# context#))))
(defhook "EntryDeleted"
"Hook called on entry deletion."
[context]
(log-deletion (:EntryID context)))
Run Code Online (Sandbox Code Playgroud)
我对这段代码的主要问题是它defmethod不支持文档字符串,所以我不能"EntryDeleted"在 REPL 或自动文档生成中使用它。最后一个对项目很重要:有defhooks 和defhandlers 作为外部 API 公开,目前我们必须单独(和手动)维护文档。
所以最简单的问题是“如何将文档字符串附加到defmethod”?.
更深层次的是“如何附加/生成自定义defsomething …
我关注Haskell懒惰评估的效率.考虑以下代码
main = print $ x + x
where x = head [1..]
Run Code Online (Sandbox Code Playgroud)
在这里,由于懒惰,x首先保持表达head [1..]而不是结果1,但是当我调用时x + x,表达式head [1..]会被执行两次吗?
我在haskell.org上找到了以下描述
另一方面,懒惰评估意味着仅在需要其结果时评估表达式(注意从"缩减"到"评估"的转变).因此,当评估引擎看到一个表达式时,它会构建一个thunk数据结构,其中包含评估表达式所需的任何值,以及指向表达式本身的指针.当实际需要结果时,评估引擎调用表达式,然后将thunk替换为结果以供将来参考.
那么这是否意味着,在x + x调用第一个时x,head [1..]执行并x重新分配1,第二个x只是调用它的引用?
我明白了吗?