闭包和通用量化

2024-03-16

我一直在尝试研究如何在 Scala 中实现 Church-encoded 数据类型。看起来它需要 n 级类型,因为你需要一个一流的const类型函数forAll a. a -> (forAll b. b -> b).

然而,我能够这样对对进行编码:

import scalaz._

trait Compose[F[_],G[_]] { type Apply = F[G[A]] }

trait Closure[F[_],G[_]] { def apply[B](f: F[B]): G[B] }

def pair[A,B](a: A, b: B) =
  new Closure[Compose[({type f[x] = A => x})#f,
                      ({type f[x] = B => x})#f]#Apply, Id] {
    def apply[C](f: A => B => C) = f(a)(b)
  }

对于列表,我能够编码cons:

def cons[A](x: A) = {
  type T[B] = B => (A => B => B) => B
  new Closure[T,T] {
    def apply[B](xs: T[B]) = (b: B) => (f: A => B => B) => f(x)(xs(b)(f))
  }
}

然而,空列表的问题更大,我无法让 Scala 编译器统一类型。

你能否定义 nil,以便根据上面的定义,下面的代码可以编译?

cons(1)(cons(2)(cons(3)(nil)))

感谢 Mark Harrah 完成了这个解决方案。诀窍是Function1标准库中没有以足够通用的方式定义。

我在问题中的“闭包”特征实际上是函子之间的自然转换。这是“函数”概念的概括。

trait ~>[F[_],G[_]] { def apply[B](f: F[B]): G[B] }

一个功能a -> b那么应该是这个特性的特化,是 Scala 类型类别上两个内函子之间的自然转换。

trait Const[A] { type Apply[B] = A }
type ->:[A,B] = Const[A]#Apply ~>: Const[B]#Apply

Const[A]是一个函子,将每种类型映射到A.

这是我们的列表类型:

type CList[A] = ({type f[x] = Fold[A,x]})#f ~> Endo

Here, Endo只是将类型映射到其自身的函数类型的别名(内功能 http://en.wikipedia.org/wiki/Endofunction).

type Endo[A] = A ->: A

And Fold是可以折叠列表的函数类型:

type Fold[A,B] = A ->: Endo[B]

最后,这是我们的列表构造函数:

def cons[A](x: A) = {
  new (CList[A] ->: CList[A]) {
    def apply[C](xs: CList[A]) = new CList[A] {
      def apply[B](f: Fold[A,B]) = (b: B) => f(x)(xs(f)(b))
    }
  }
}

def nil[A] = new CList[A] {
  def apply[B](f: Fold[A,B]) = (b: B) => b
}

需要注意的是,需要将 (A ->: B) 显式转换为 (A => B) 以帮助 Scala 的类型系统顺利进行。因此,在创建后实际折叠列表仍然非常冗长和乏味。这是用于比较的等效 Haskell:

nil p z = z
cons x xs p z = p x (xs p z)

Haskell 版本中的列表构造和折叠非常简洁且无噪音:

let xs = cons 1 (cons 2 (cons 3 nil)) in xs (+) 0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

闭包和通用量化 的相关文章

  • Scala 警告、IntelliJ 和编译器标志

    我目前正在试用 IntelliJ Scala 插件 有件事让我有点烦恼 编译时我收到 3 个警告 Warning scala Recompiling 4 files Warning scala Warning scala there wer
  • akka-http:找不到参数解组的隐式值

    我的 Spray json 支持看起来像这样 object MarshallingSupport extends SprayJsonSupport implicit def json4sFormats Formats DefaultForm
  • 如何在Scala中表达这个类型?存在类型类(即隐式)限制吗?

    我正在使用 Play 框架的 JSON 库 它使用类型类来实现Json toJson功能 http www playframework org documentation api 2 0 4 scala index html play ap
  • Scala 中的行聚合

    我正在寻找一种方法在 Scala 的数据框中获取一个新列来计算min max中的值col1 col2 col10对于每一行 我知道我可以使用 UDF 来做到这一点 但也许有一种更简单的方法 Thanks Porting 这个Python答案
  • 如何设置 jacoco4sbt 来处理 Play 中主模块和子模块中的类?

    我有一些问题要解决雅可可4sbt https github com sbt jacoco4sbt正在使用我的 Play 2 3 4 项目 我的项目由 3 个子模块组成 common api and frontend并且没有代码app根文件夹
  • 如何从java程序的main方法调用Scala程序的main方法?

    假设我在 Java 项目中有一个 Scala 类和一个 Java 类 scala 类如下所示 class Sam def main args Array String Unit println Hello 如何从同一项目中存在的 java
  • Build.scala中%和%%符号含义

    我是新来玩的 Framework 2 1 java版本 并且没有scala经验 我不明白什么是以及什么是 and 在 Build scala 中表示 我用谷歌搜索了它们但找不到它们的含义 在我的 Build scala 文件中 我有 org
  • 函数式语言与语言实现的角度有何不同

    出现了全新的 函数式编程 范式 与过程式编程相比 它需要彻底改变思维模式 它使用高阶函数 纯度 单子等 我们通常在命令式和面向对象语言中不会看到这些 我的问题是如何执行这些语言与命令式或面向对象语言的不同之处在于 例如内存管理或指针等内部结
  • WSClient - 打开的文件太多

    我正在 CentOS 6 上使用 Play Framework 2 4 我的应用程序抛出此异常 java net SocketException Too many open files 我在 Stack Overflow 上搜索了很多主题并
  • 如何使用 rxpy/rxjs 延迟事件发射?

    我有两个事件流 一个来自电感环路 另一个来自网络摄像机 汽车将驶过环路 然后撞上相机 如果事件彼此相差在 N 毫秒内 汽车总是会首先进入循环 我想将它们组合起来 但我也希望每个流中不匹配的事件 硬件可能会失败 全部合并到单个流中 像这样的事
  • xsbt 插件 1.0.0-M7 和 scalatra

    我尝试在我的 scalatra 项目中将 xsbt 插件升级到 1 0 0 M7 但 scalatra 似乎与此版本不兼容 当我尝试重新加载项目时 出现以下错误 我尝试过 scalatra 2 3 0 版本 问候 德斯 java lang
  • 如何在每行中添加行号?

    假设这些是我的数据 Maps and Reduces are two phases of solving a query in HDFS Map is responsible to read data from input location
  • 在 Scala 中创建任意类作为 monad 实例

    为了使任何东西都可以在 monad 上下文中操作 如果使用 Haskell 我只需在任何地方为给定类型添加类 Monad 的实现 所以我根本不接触数据类型定义的来源 像 人造的东西 data Z a MyZLeft a MyZRight a
  • 导入 sbt 项目时出错,服务器访问错误,未解决的依赖项

    我正在尝试从 IntelliJ IDE 15 0 2 的 build sbt 中导入我的项目中的库 我不断收到未解决的依赖项错误 我尝试更新不同论坛的设置来解决该问题 但没有任何效果 我尝试过的几件事 使用代理设置更新 sbtconfig
  • 如果需要,Akka actor 可以从邮箱中删除消息吗?

    例如 如果我想从队列中删除冗余消息 这样当演员收到Connect消息 它应该检查它的邮箱并删除其他Connect消息 以便只进行一个连接而不是多个连接 这样的事情可能吗 是的 您可以将参与者调度程序配置为具有您选择的任何邮箱 因此如果您实现
  • Java 中的正则表达式,\\s 与 \\s+

    下面两个表达式有什么区别 x x replaceAll s x x replaceAll s 第一个匹配单个空格 而第二个匹配一个或多个空格 它们是所谓的正则表达式量词 它们执行像这样的匹配 取自文档 http docs oracle co
  • 如何将 JVM 选项传递给 SBT 以在运行应用程序或测试用例时使用?

    我想在运行我的应用程序或通过 SBT 对应用程序进行测试时指定 JVM 选项 具体来说 我需要能够为 JVM 提供 Djava security policy 参数 以便加载我的策略并用于测试 我怎样才能用 SBT 做到这一点 With x
  • Scala 将集合转变为按键映射的最佳方法?

    如果我有一个收藏c类型的T并且有一个属性p on T 类型P 说 最好的方法是什么按提取键映射 val c Collection T val m Map P T 一种方法如下 m new HashMap P T c foreach t gt
  • 在 scala 中混合类型参数和抽象类型

    我正在尝试使用的答案前面的问题 https stackoverflow com questions 2059601 circular type parameters definition in scala实现一个小型图形库 这个想法是将图视
  • 这种奇怪的 Scala 内存泄漏的原因是什么? [复制]

    这个问题在这里已经有答案了 即使有 7G 的堆空间 这也会耗尽内存 import scala collection mutable Set class Foo val anEmptySet Set Int Set def bar ints

随机推荐

  • 你可以在 ruby​​ 中重新定义一个类吗?或者这只是在irb中

    我启动了 irb 然后输入 类点 结尾 然后我又输入了一遍 但添加了一些其他内容 Irb 并没有抱怨我正在定义一个已经存在的类 实际上你并没有重新定义Point类 而是重新打开了它 一个小代码片段来说明差异 class Point def
  • C++:具有虚基但没有虚函数的类是多态的并且具有 VTable 吗?

    考虑以下代码 include
  • UnmarshaException 意外元素,预期元素为(无)

    当我想反序列化我已经从字节数组序列化的 JAXBElement 时 我遇到了问题 我得到了例外 Exception in thread main javax xml bind UnmarshalException unexpected el
  • TextBox 上的 MinLines 和 MaxLines 不起作用

    谁能解释为什么下面的 TextBox 最初不显示为 3 行高 当我开始输入文本时 它显示 1 行高 然后调整为 3 行 编辑 这是更多的表格
  • 如何从测试中访问 Flutter 环境变量?

    我一直在使用 flutter dotenv 加载保存在的环境变量 env整个应用程序到目前为止都运行良好 当我尝试编写测试时 我似乎无法从测试文件访问这些测试 import package flutter dotenv flutter do
  • 如果文本框突然有值如何无法按钮

    任何人都可以帮助我如何禁用我的按钮 如果我texbox突然充满了文本 而没有单击文本框来输入内容 我的问题是我的代码无法工作 有谁知道该怎么做
  • 使用curl将工件包上传到sonatype:500服务器错误

    我想上传一个工件包 jar 到https oss sonatype org https oss sonatype org与curl命令 curl verbose user SONATYPE USER SONATYPE PASSWORD fo
  • useContext React JS 延迟

    在我的 React 应用程序中 当用户登录时 会生成一个令牌 JWT 然后将其存储在 LocalStorage 中 一切完成后 为了维护不同路由的用户登录 我使用 useContext 我想在用户登录时显示注销按钮 实际上它会出现 但 2
  • 检测 WebView 内的可用内存

    我正在构建一个应用程序 其中包含WebView运行一些 JavaScript 代码 JavaScript 代码的分配量很大 可能需要大量内存 有时 所需的内存量超出了 JavaScript 所需的内存量 导致 WebView 的 Chrom
  • mysql_connect():标头和客户端库次要版本不匹配库:100005

    自从上周五执行定期包更新以来 我的网络服务器遇到了一个相当棘手的问题 我在使用 mysql connect 时遇到错误 Warning mysql connect Headers and client library minor versi
  • 精确定位 magento 1.6.2 中两个页面之间的差异和更改

    我有两个页面应该使用完全相同的模板和布局 正确的项目布局如下所示 http dokha co index php medwakh custom medwakh from white horse studios 13 html http do
  • 处理大量数据的WCF服务的最佳实践?

    我们有一个 WCF 服务 用于查询底层数据存储 现在是 SQL Server 2005 该服务可能会返回相当大量的数据 我们的实体类有 60000 多个实例 其中包含约 20 个属性 这些属性大多是基元 例如 string int Date
  • 将 azure 应用程序服务/网站限制为域

    我有一个在 azure 应用程序服务上运行的 WCF 服务 我想将此 WCF 限制为一些天蓝色网站 外部 IP 和一些其他部署 我在 WCF web config 中使用 IPSecurity 标记 我的问题是 IP 限制有效 但我允许访问
  • warp 如何与原子操作一起工作?

    warp 中的线程在物理上并行运行 因此如果其中一个 称为线程 X 启动原子操作 其他线程会做什么 等待 这是否意味着 当线程 X 被推入原子队列时 所有线程都将等待 获得访问权限 互斥体 并对受该互斥体保护的内存执行一些操作 然后再释放互
  • 定义日期格式 java 'rd' 'st' 'th' 'nd'

    我有一个字符串 星期六 10 月 25 日 11 40 这个日期有什么格式 我怎样才能解析序数指示符 http en m wikipedia org wiki Ordinal indicator 这是我想要的转换方式 private Str
  • Java 8 中的方法参考

    public class Car private int maxSpeed public Car int maxSpeed this maxSpeed maxSpeed public int getMaxSpeed return maxSp
  • WPF C# 应用程序运行 2-3 次就会冻结我的整个计算机

    我在这个问题上放了很多信息 因为我不知道什么是相关的 Issue 我遇到一个问题 我正在开发的程序在运行时会冻结我的整个计算机并且不返回任何错误 我完全无法执行任何 CTRL ALT DEL 甚至不起作用的操作 该程序接受来自 Androi
  • 用 C++ 扩展 PHP?

    我有一个用 PHP 编写的性能密集型例程 我想将其移植到 C 以提高性能 有没有办法使用 C 编写插件或扩展或其他东西并从 PHP 与之交互 无需手动编辑实际的 PHP 源代码 As 莱姆斯 说 https stackoverflow co
  • 将 object_setInstanceVariable() 转换为 ARC?

    我希望转换一个实例 object setInstanceVariable self key UTF8String id addr 到 ARC 当我尝试使用 Xcode 内置 Objective C ARC 转换器时 出现以下错误 objec
  • 闭包和通用量化

    我一直在尝试研究如何在 Scala 中实现 Church encoded 数据类型 看起来它需要 n 级类型 因为你需要一个一流的const类型函数forAll a a gt forAll b b gt b 然而 我能够这样对对进行编码 i