小编fiz*_*ruk的帖子

什么是免费monad?

我见过的长期免费单子弹出每一个 现在 随后一段时间,但每个人似乎只是使用/讨论这些问题没有给予它们是什么解释.所以:什么是免费的monads?(我会说我熟悉monad和Haskell的基础知识,但对类别理论只有非常粗略的了解.)

monads haskell free-monad

357
推荐指数
7
解决办法
5万
查看次数

商数类型如何帮助安全地暴露模块内部?

阅读关于商类型及其在函数式编程中的使用,我发现了这篇文章.作者提到Data.Set了一个模块的例子,它提供了大量需要访问模块内部的功能:

Data.Set有36个函数,当真正需要确保一个集合的意义("这些元素是不同的")时,toListfromList.

作者的观点似乎是,如果我们忘记了一些只能使用模块内部有效实现的功能,我们需要"打开模块并打破抽象".

然后他说

我们可以用商型来缓解所有这些混乱局面.

但没有解释这个说法.

所以我的问题是:商如何帮助这里?


编辑

我做了一些研究,发现了一篇论文"构建具有商数类型的多态程序".它详细阐述了容器的容器,并在摘要和引言中提到了"有效"这个词.但是如果我没有误读,它就没有给出任何有效表示"隐藏"商容器的例子.


编辑2

多一点表现在"[PDF]在同伦理论型编程"的文件在第3章,作为一个依赖和使用商类型可以实现的事实.引入了关于抽象类型的视图(看起来与类型类非常相似),并提供了一些相关的Agda代码.然而本章的重点是关于抽象类型的推理,所以我不确定这与我的问题有什么关系.

haskell type-systems type-theory functional-programming

17
推荐指数
2
解决办法
1154
查看次数

自定义定义的文档字符串

在我正在处理的项目中,我们经常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 …

documentation clojure

5
推荐指数
1
解决办法
808
查看次数

我对Haskell的懒惰评估感到困惑

我关注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只是调用它的引用?

我明白了吗?

haskell lazy-evaluation

3
推荐指数
2
解决办法
490
查看次数