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