热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DMN中的函数式编程:感觉就像再次重读我的大学课程一样

在本文中,我想分享有关DMN中的递归支持的有趣见解,并重点介绍FEEL语言的特定属性如何使功能编程结构能够在DMN中建模。我们将从一个基本的示例开始&#

在本文中,我想分享有关DMN中的递归支持的有趣见解,并重点介绍FEEL语言的特定属性如何使功能编程结构能够在DMN中建模。

我们将从一个基本的示例开始,以演示FEEL语言和DMN构造的“商业友好”性质如何使我们能够解决一个通常不愉快的问题:递归函数的定义。 然后,我们将在FP土地中冒险,并且在FEEL / DMN的摇篮中,我们将欣赏功能构造最好的生物之一:Y Combinator。 最后,我们将再次被问到一个著名的问题:

使用纯工程方法,让我们立即深入研究问题!

基本递归示例

Drools DMN开源引擎允许在DMN商业知识模型节点中提供递归支持。 这使递归函数的建模非常容易, 这是在DMN中为递归函数建模时的推荐方法 :允许函数以其名称进行调用。

让我们看一个简单的示例:在DMN中对阶乘函数建模。

我们可以使用Kogito DMN编辑器,并如下定义DRD:

使用“事实”业务知识模型(简称BKM)节点以递归方式定义实际的阶乘函数为:

我们可以注意到,该函数像其他任何普通函数一样调用自身
递归函数,唯一的区别是它被定义为DMN Boxed Expression的一部分; 该函数的名称由BKM节点使用框式表达式构造“ fac”定义,然后该函数的主体进行引用并将其自身作为FEEL表达式“ fac(n-1)”的一部分进行调用。

我们可以使用此BKM来计算输入数据节点传递的实际结果,作为“计算阶乘”决策的一部分,如下所示:

这可以很好地工作并给出预期的结果:

{ 我的电话:3 fac:函数fac(n) 计算阶乘:6 }

关于柯里

DMN以及更重要的是FEEL语言允许定义和调用咖喱函数。

这使我们可以在FEEL中编写如下内容:

{f:function(a)function(b)a + b,r:f(1)(2)}

哪里:

  • 我们定义了一个touch:context有2个条目
  • 第一个条目名为“ f”并定义了一个咖喱函数:一个参数“ a”的函数,一旦被调用,将返回一个参数“ b”的函数,一旦被调用,将返回a + b的和
  • 后一个名为“ r”的条目以a = 1和b = 2调用咖喱函数。

尽管这可能是一个看起来很奇怪的FEEL表达式,但是一旦执行r = 3,我们就不会感到惊讶。

我们可以使用DMN Boxed Expression构造等效地做:

这是一个名为“咖喱和”的BKM节点; DMN可调用一个参数“ a”,一旦被调用,将返回一个参数“ b”的函数,该函数一旦被调用,将返回a + b之和。

同样,一旦执行我们就不会感到惊讶 咖喱求和(1)(2)= 3

Y组合器:无递归支持的递归

让我们回头看一下前面的递归函数示例。 我们忽略了以下事实:在DMN中,函数实际上是否可以通过其名称进行自身调用:DMN规范未明确支持此功能,但也未明确禁止它。 换句话说,没有正式指定递归支持。

如果我们仍然需要定义递归函数,但又发现道路仍在建设中,缺少正式的递归支持,该怎么办? 我们可以使用一种称为“ Y Combinator ”的功能设备,该设备允许匿名函数实现递归,而不必依靠自身(不存在)的名称进行自我调用。

让我们看一个例子; 我们可以在DMN中定义Y组合器,如下所示:

它可能是一个看起来很奇怪的函数:)让我们假设它是为我们定义的,我们可以使用它。

我们可以使用它来重新定义阶乘计算,如下所示:

我们可以注意到,“ fac”函数定义的主体在总体上是相同的; 但是,它不再是一个通过名称调用自身的函数:在函数主体中没有任何对“ fac(…)”的调用的痕迹!

自然,仍然会有某种形式的递归发生,但是这次是利用闭包范围内的参数名称:“ f”。 结果按预期工作: fac(3)= 6

我们可以看一下另一个示例,该示例使用DMN中的Y组合器定义斐波那契序列:

我们再次注意到,在函数体中没有对“ fib(…)”的调用,但是由于使用了Y组合器,因此可以执行斐波那契数列的递归计算。

再次,结果按预期工作: fib(5)= [1、2、3、5]

为了获得更多乐趣,我们可以使用DMN Boxed Expression形式重新定义Y组合器。 这是一个有趣的练习,了解如何在其盒装变量中应用闭包。 Y组合器的定义可以重构为:

这将再次产生相同的预期和正确结果。

对于(额外(额外的乐趣)),我们可以在单个FEEL表达式中再次重新定义Y组合器以计算例如4的阶乘:

{Y:function(f)(function(x)x(x))(function(y)f(function(x)y(y)(x))),fac:Y(function(f)function(n)如果n> 1,则n * f(n-1)否则1),fac4:fac(4)} .fac4

结果不出所料:24。

结论

在本文中,我们看到了DMN中递归的基本示例,并且如何在引擎中利用递归支持非常简单; 支持引擎递归支持是我们建议实现递归DMN的方法:给函数命名,并在函数主体中使用该名称来调用自身。 在该示例中,我们将函数命名为“ fac”,然后在函数本身的主体中调用了“ fac(…)”。

这种方法非常实用,易于在DMN中建模,并且效果很好。

我们还看到了DMN和FEEL如何确实支持咖喱函数定义和调用。 FEEL(也是)一种功能语言; 所有这些属性使我们能够在DMN中定义并使用Y Combinator,这是一种无需递归支持即可实现递归的功能性设备!

我个人发现这些练习对于在DMN中应用函数式编程概念非常有趣,同时确保引擎按预期运行。 我要特别感谢我的同事Edoardo Vacchi和Luca Molteni在讨论Y组合器和Currying功能时所给予的支持。

对DMN感兴趣?

如果您以前不了解DMN,那么您会发现这篇文章很有趣,但是想要对DMN标准进行温和介绍,我们提供了有关DMN的正确的崩溃课程,您可以通过以下网址免费获得: http://learn-dmn-in-15-minutes.com

翻译自: https://www.javacodegeeks.com/2020/04/functional-programming-in-dmn-it-feels-like-recursing-my-university-studies-again.html



推荐阅读
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
author-avatar
李明hallo_766
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有