将更高种类的类型(单子!)嵌入到无类型的 lambda 演算中

2024-01-05

可以通过高阶函数对无类型 lambda 演算中的各种类型进行编码。

Examples:
zero  = λfx.      x
one   = λfx.     fx
two   = λfx.   f(fx)
three = λfx. f(f(fx))
etc

true  = λtf. t
false = λtf. f

tuple = λxyb. b x y
null  = λp. p (λxy. false)

我想知道是否有任何研究涉及嵌入其他不太传统的类型。如果有某个定理断言可以嵌入任何类型,那就太好了。也许有一些限制,例如只能嵌入 kind * 的类型。

如果确实可以表示不太常规的类型,那么看到一个例子就太好了。我特别想看看 monad 类型类的成员是什么样子的。


几乎可以表示您想要的任何类型。但由于每种类型的一元操作的实现方式都不同,所以not可以写>>=一次并让它适用于每个实例。

然而,你can编写依赖于的通用函数evidence类型类的实例。考虑e这里是一个元组,其中fst e包含“绑定”定义,并且snd e包含“返回”定义。

bind = λe. fst e    -- after applying evidence, bind looks like λmf. ___
return = λe. snd e  -- after applying evidence, return looks like λx. ___

fst = λt. t true
snd = λt. t false

-- join x = x >>= id
join = λex. bind e x (λz. z)

-- liftM f m1 = do { x1 <- m1; return (f x1) }
-- m1 >>= \x1 -> return (f x1)
liftM = λefm. bind e m (λx. return e (f x))

然后,您必须为 Monad 的每个实例定义一个“证据元组”。请注意,我们定义的方式bind and return:它们的工作方式就像我们定义的其他“通用”Monad 方法一样:必须首先给出它们evidenceMonad-ness,然后它们按预期运行。

我们可以代表Maybe作为一个需要 2 个输入的函数,第一个是要执行的函数,如果它是Just x,第二个是如果为 Nothing 则替换它的值。

just = λxfz. f x
nothing = λfz. z

-- bind and return for maybes
bindMaybe = λmf. m f nothing
returnMaybe = just

maybeMonadEvidence = tuple bindMaybe returnMaybe

列表类似,将列表表示为它的折叠函数。因此,列表是一个需要 2 个输入的函数,一个“cons”和一个“empty”。然后它执行foldr myCons myEmpty在名单上。

nil = λcz. z
cons = λhtcz. c h (t c z)

bindList = λmf. concat (map f m)
returnList = λx. cons x nil

listMonadEvidence = tuple bindList returnList

-- concat = foldr (++) []
concat = λl. l append nil

-- append xs ys = foldr (:) ys xs
append = λxy. x cons y

-- map f = foldr ((:) . f) []
map = λfl. l (λx. cons (f x)) nil

Either也很简单。将任一类型表示为具有两个函数的函数:如果它是一个函数,则应用一个函数Left,如果它是一个则要申请另一个Right.

left = λlfg. f l
right = λrfg. g r

-- Left l >>= f = Left l
-- Right r >>= f = f r
bindEither = λmf. m left f
returnEither = right

eitherMonadEvidence = tuple bindEither returnEither

别忘了,函数他们自己 (a ->)形成一个单子。 lambda 演算中的所有内容都是一个函数...所以...不要想得太难。 ;) 直接从源头获得灵感控制.Monad.实例 http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/Control-Monad-Instances.html

-- f >>= k = \ r -> k (f r) r
bindFunc = λfkr. k (f r) r
-- return = const
returnFunc = λxy. x

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

将更高种类的类型(单子!)嵌入到无类型的 lambda 演算中 的相关文章

随机推荐

  • Facebox 轨道应用

    知道我已经安装了 jquery rails gem 如何在 Rails 应用程序中使用 Facebox 还需要进入视图的示例代码 谢谢 将 Facebox 库包含在您的 application html erb 文件中 将此代码添加到 Ja
  • 调试器不会在断点处暂停

    我遇到一个问题 希望能获得一些配置 Atom 和 Xdebug 的帮助 我可以设置断点 它们会显示在断点面板中 但该过程永远不会暂停 奇怪的是 该过程确实在异常警告时暂停 所以我知道它在某种程度上连接 但只是不在断点处暂停 我的 php i
  • Spring Boot App Engine 日志消息未显示

    我有一个 Spring Boot 应用程序 正在使用 Java 8 部署到 App Engine 标准环境 我似乎无法在云控制台的日志查看器中显示日志消息 我确实有其他日志在工作 例如端点被击中 日志记录 属性 level FINEST a
  • 使用 val().match() 方法的 Javascript 正则表达式

    我正在尝试使用以下规则验证名为phone number 的字段 第一个数字应该是 3 然后是另外 9 个数字 总共 10 个数字例如 3216549874 或者可以是 7 个数字 1234567 这里我有我的代码 if val htmlId
  • Spring中的上下文注解有什么作用?

    在Rest API设计中 我想知道上下文注释的确切目的是什么 private HttpServletRequest request Context public void setRequest final HttpServletReques
  • FormatConditions 边框位于单边上

    当第一列中的数据发生变化时 我尝试在行之间添加边框 这段代码中断于 LineStyle xlContinuous 我收到的错误是 无法设置 Border 类的 LineStyle 属性 代码中是否存在错误或执行此操作的替代方法 Sub Ad
  • wasm-pack 构建报告错误:无法编译 `net2`

    我使用尝试使用 rust wasm 提到的https rustwasm github io book game of life hello world html 全部 https rustwasm github io book game o
  • PayPal 付款标准自定义 HTML 表单; PayPal 如何知道谁在提交?

    我正在尝试获取此表格以使用 PayPal 付款标准发起捐赠
  • vbscript如何按修改日期对子文件夹中的文件进行排序(并使用文件的绝对路径打印)

    我需要创建一个vbs来按包含子文件夹的文件夹中的修改日期对可设置数量的文件 仅文件 进行排序 并使用绝对路径打印文件 如下所示 The vbs Dim MAX Dim Folder MAX 100 Folder C Test vbscrip
  • 我如何设置图像的一部分与应用栏重叠

    我把Toolbar inside CollapsingToolbarLayout使用图像创建折叠工具栏效果 以便工具栏使用容器布局响应滚动事件AppBarLayout 我想添加另一个图像 它的顶部与应用栏重叠 就像 Play 商店应用中的海
  • java nio Files.copy 抛出 Java 堆空间内存不足

    我正在尝试创建一个包含文件集合的 zip 文件 我使用 java nio Files 类来执行此操作 Files copy toBeAdded internalTargetPath StandardCopyOption REPLACE EX
  • 如何使用 GPUImage 框架实现这些过滤器链接?

    我正在尝试链接混合层并过滤它 原点 gt 纹理 1 不透明度 30 强光 gt 纹理 2 柔光 gt 级别 45 0 95 238 饱和度 100 色调 42 这是我尝试过的 编辑 此代码在下面工作 感谢您的回答 Textures GPUI
  • Android如何创建弹出窗口

    我需要创建一个带有按钮的弹出窗口和一个将关闭弹出窗口的按钮 我找到了一些教程 但不知道如何实施 我想要做什么 单击操作按钮 弹出窗口显示 当我单击关闭按钮时 弹出窗口必须关闭 教程中有一个onCreate方法 我不明白它是如何调用的 有人可
  • 我们可以更改 样式吗? [复制]

    这个问题在这里已经有答案了 我尝试更改 HTML 表单 输入类型文件 这是我的代码 HTML 表单 ID 表单
  • 配置更改后恢复片段的对象引用

    我的活动中有一个复杂的数据对象 当用户想要编辑该对象的数据时 会显示一个类似片段的浮动对话框 该片段引用了数据对象的某些部分 用户对此片段中的数据进行实时编辑 例如 一些简单的文本编辑 当用户编辑此数据时 会发生配置更改 著名的方向更改 更
  • usePageViewController 选项的键/值

    我可以在其中指定哪些键 值withViewOptions的参数usePageViewControlleriOS11的PDFView PDFKit的方法 根据中找到的文档PDFKit usePageViewController withVie
  • 根据每次确定性有限自动机达到最终状态来分割字符串?

    我有一个问题 有一个可以通过迭代解决的解决方案 但我想知道是否有更优雅的解决方案使用正则表达式和split 我有一个字符串 excel 将其放在剪贴板上 本质上是用逗号分隔的 需要注意的是 当单元格值包含逗号时 整个单元格都会用引号引起来
  • 删除 XML 节点

    我还有另一个无法完成的任务 我应该解析来自这个网站 http feeds bbci co uk news health rss xml 删除名称中不包含 VIDEO 的所有节点 然后将其保存到另一个 XML 文件 我的阅读和写作没有任何问题
  • 在构造函数中实例化对象

    执行以下操作是否有任何好处 public class Foo private Bar bar public Foo bar new Bar 而不是这样做 public class Foo private Bar bar new Bar pu
  • 将更高种类的类型(单子!)嵌入到无类型的 lambda 演算中

    可以通过高阶函数对无类型 lambda 演算中的各种类型进行编码 Examples zero fx x one fx fx two fx f fx three fx f f fx etc true tf t false tf f tuple