DMN中的函数式编程:感觉就像再次重读我的大学课程一样
在本文中,我想分享有關(guān)DMN中的遞歸支持的有趣見(jiàn)解,并重點(diǎn)介紹FEEL語(yǔ)言的特定屬性如何使功能編程結(jié)構(gòu)能夠在DMN中建模。
我們將從一個(gè)基本的示例開(kāi)始,以演示FEEL語(yǔ)言和DMN構(gòu)造的“商業(yè)友好”性質(zhì)如何使我們能夠解決一個(gè)通常不愉快的問(wèn)題:遞歸函數(shù)的定義。 然后,我們將在FP土地中冒險(xiǎn),并且在FEEL / DMN的搖籃中,我們將欣賞功能構(gòu)造最好的生物之一:Y Combinator。 最后,我們將再次被問(wèn)到一個(gè)著名的問(wèn)題:
使用純工程方法,讓我們立即深入研究問(wèn)題!
基本遞歸示例
Drools DMN開(kāi)源引擎允許在DMN商業(yè)知識(shí)模型節(jié)點(diǎn)中提供遞歸支持。 這使遞歸函數(shù)的建模非常容易, 這是在DMN中為遞歸函數(shù)建模時(shí)的推薦方法 :允許函數(shù)以其名稱進(jìn)行調(diào)用。
讓我們看一個(gè)簡(jiǎn)單的示例:在DMN中對(duì)階乘函數(shù)建模。
我們可以使用Kogito DMN編輯器,并如下定義DRD:
使用“事實(shí)”業(yè)務(wù)知識(shí)模型(簡(jiǎn)稱BKM)節(jié)點(diǎn)以遞歸方式定義實(shí)際的階乘函數(shù)為:
我們可以注意到,該函數(shù)像其他任何普通函數(shù)一樣調(diào)用自身
遞歸函數(shù),唯一的區(qū)別是它被定義為DMN Boxed Expression的一部分; 該函數(shù)的名稱由BKM節(jié)點(diǎn)使用框式表達(dá)式構(gòu)造“ fac”定義,然后該函數(shù)的主體進(jìn)行引用并將其自身作為FEEL表達(dá)式“ fac(n-1)”的一部分進(jìn)行調(diào)用。
我們可以使用此BKM來(lái)計(jì)算輸入數(shù)據(jù)節(jié)點(diǎn)傳遞的實(shí)際結(jié)果,作為“計(jì)算階乘”決策的一部分,如下所示:
這可以很好地工作并給出預(yù)期的結(jié)果:
{ 我的電話:3 fac:函數(shù)fac(n) 計(jì)算階乘:6 }
關(guān)于柯里
DMN以及更重要的是FEEL語(yǔ)言允許定義和調(diào)用咖喱函數(shù)。
這使我們可以在FEEL中編寫(xiě)如下內(nèi)容:
{f:function(a)function(b)a + b,r:f(1)(2)}
哪里:
- 我們定義了一個(gè)touch:context有2個(gè)條目
- 第一個(gè)條目名為“ f”并定義了一個(gè)咖喱函數(shù):一個(gè)參數(shù)“ a”的函數(shù),一旦被調(diào)用,將返回一個(gè)參數(shù)“ b”的函數(shù),一旦被調(diào)用,將返回a + b的和
- 后一個(gè)名為“ r”的條目以a = 1和b = 2調(diào)用咖喱函數(shù)。
盡管這可能是一個(gè)看起來(lái)很奇怪的FEEL表達(dá)式,但是一旦執(zhí)行r = 3,我們就不會(huì)感到驚訝。
我們可以使用DMN Boxed Expression構(gòu)造等效地做:
這是一個(gè)名為“咖喱和”的BKM節(jié)點(diǎn); DMN可調(diào)用一個(gè)參數(shù)“ a”,一旦被調(diào)用,將返回一個(gè)參數(shù)“ b”的函數(shù),該函數(shù)一旦被調(diào)用,將返回a + b之和。
同樣,一旦執(zhí)行我們就不會(huì)感到驚訝 咖喱求和(1)(2)= 3
Y組合器:無(wú)遞歸支持的遞歸
讓我們回頭看一下前面的遞歸函數(shù)示例。 我們忽略了以下事實(shí):在DMN中,函數(shù)實(shí)際上是否可以通過(guò)其名稱進(jìn)行自身調(diào)用:DMN規(guī)范未明確支持此功能,但也未明確禁止它。 換句話說(shuō),沒(méi)有正式指定遞歸支持。
如果我們?nèi)匀恍枰x遞歸函數(shù),但又發(fā)現(xiàn)道路仍在建設(shè)中,缺少正式的遞歸支持,該怎么辦? 我們可以使用一種稱為“ Y Combinator ”的功能設(shè)備,該設(shè)備允許匿名函數(shù)實(shí)現(xiàn)遞歸,而不必依靠自身(不存在)的名稱進(jìn)行自我調(diào)用。
讓我們看一個(gè)例子; 我們可以在DMN中定義Y組合器,如下所示:
它可能是一個(gè)看起來(lái)很奇怪的函數(shù):)讓我們假設(shè)它是為我們定義的,我們可以使用它。
我們可以使用它來(lái)重新定義階乘計(jì)算,如下所示:
我們可以注意到,“ fac”函數(shù)定義的主體在總體上是相同的; 但是,它不再是一個(gè)通過(guò)名稱調(diào)用自身的函數(shù):在函數(shù)主體中沒(méi)有任何對(duì)“ fac(…)”的調(diào)用的痕跡!
自然,仍然會(huì)有某種形式的遞歸發(fā)生,但是這次是利用閉包范圍內(nèi)的參數(shù)名稱:“ f”。 結(jié)果按預(yù)期工作: fac(3)= 6
我們可以看一下另一個(gè)示例,該示例使用DMN中的Y組合器定義斐波那契序列:
我們?cè)俅巫⒁獾?#xff0c;在函數(shù)體中沒(méi)有對(duì)“ fib(…)”的調(diào)用,但是由于使用了Y組合器,因此可以執(zhí)行斐波那契數(shù)列的遞歸計(jì)算。
再次,結(jié)果按預(yù)期工作: fib(5)= [1、2、3、5]
為了獲得更多樂(lè)趣,我們可以使用DMN Boxed Expression形式重新定義Y組合器。 這是一個(gè)有趣的練習(xí),了解如何在其盒裝變量中應(yīng)用閉包。 Y組合器的定義可以重構(gòu)為:
這將再次產(chǎn)生相同的預(yù)期和正確結(jié)果。
對(duì)于(額外(額外的樂(lè)趣)),我們可以在單個(gè)FEEL表達(dá)式中再次重新定義Y組合器以計(jì)算例如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
結(jié)果不出所料:24。
結(jié)論
在本文中,我們看到了DMN中遞歸的基本示例,并且如何在引擎中利用遞歸支持非常簡(jiǎn)單; 支持引擎遞歸支持是我們建議實(shí)現(xiàn)遞歸DMN的方法:給函數(shù)命名,并在函數(shù)主體中使用該名稱來(lái)調(diào)用自身。 在該示例中,我們將函數(shù)命名為“ fac”,然后在函數(shù)本身的主體中調(diào)用了“ fac(…)”。
這種方法非常實(shí)用,易于在DMN中建模,并且效果很好。
我們還看到了DMN和FEEL如何確實(shí)支持咖喱函數(shù)定義和調(diào)用。 FEEL(也是)一種功能語(yǔ)言; 所有這些屬性使我們能夠在DMN中定義并使用Y Combinator,這是一種無(wú)需遞歸支持即可實(shí)現(xiàn)遞歸的功能性設(shè)備!
我個(gè)人發(fā)現(xiàn)這些練習(xí)對(duì)于在DMN中應(yīng)用函數(shù)式編程概念非常有趣,同時(shí)確保引擎按預(yù)期運(yùn)行。 我要特別感謝我的同事Edoardo Vacchi和Luca Molteni在討論Y組合器和Currying功能時(shí)所給予的支持。
對(duì)DMN感興趣?
如果您以前不了解DMN,那么您會(huì)發(fā)現(xiàn)這篇文章很有趣,但是想要對(duì)DMN標(biāo)準(zhǔn)進(jìn)行溫和介紹,我們提供了有關(guān)DMN的正確的崩潰課程,您可以通過(guò)以下網(wǎng)址免費(fèi)獲得: 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
總結(jié)
以上是生活随笔為你收集整理的DMN中的函数式编程:感觉就像再次重读我的大学课程一样的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 聚分享qq气泡设置(QQ气泡分享)
- 下一篇: Win10无法开机并显示PXE-MOF: