帶嚴(yán)格參數(shù)的函數(shù)
在我的教科書中,一個(gè)修正的測(cè)驗(yàn)問(wèn)我有多少f的參數(shù)是嚴(yán)格的,f為:f x0 z=x==zf x y z=xMy最初的想法是,f的所有參數(shù)都被認(rèn)為是嚴(yán)格的,因?yàn)閥的求值是為了檢查它
解答動(dòng)態(tài)
事實(shí)證明,f在第二個(gè)參數(shù)中是否嚴(yán)格取決于它被解析為什么類型證明:
data ModOne=Zeroinstance Eq ModOne其中u===True——畢竟,它們都是零,對(duì)吧?instance Num ModOne——方法實(shí)現(xiàn)實(shí)際上并不重要rf x 0 z=x==zf x y z=x Now inghci:
gt;f真(未定義::Int)真***異常:前奏曲未定義,以一種相關(guān)的方式,f在其第三個(gè)參數(shù)中是否嚴(yán)格取決于您為前兩個(gè)參數(shù)選擇的值。證明,再次:
gt;f真0未定義***異常:前奏曲未定義,這個(gè)問(wèn)題其實(shí)沒(méi)有一個(gè)簡(jiǎn)單的答案!f在第一個(gè)參數(shù)中是絕對(duì)嚴(yán)格的,但是其他兩個(gè)參數(shù)是有條件的一個(gè)或另一個(gè)取決于具體情況。
首先,你需要一個(gè)非常精確的“嚴(yán)格”定義,這樣才有意義。函數(shù)f是嚴(yán)格的iff,它將fx求值為whnf,從而使x求值為whnf。這與currying的交互有點(diǎn)尷尬,我將忽略一些潛在的奇怪之處。
假設(shè)這里的類型是f::Bool-gt;Bool->;Bool你對(duì)wrt y行為的分析是正確的-計(jì)算fx y z到whnf總是需要計(jì)算y來(lái)決定選擇哪個(gè)等式。因?yàn)檫@是決定使用哪一個(gè)方程的唯一因素,所以我們必須將x和z的分析分開。在第一個(gè)方程中,將結(jié)果評(píng)估為whnf,結(jié)果是x和z都被評(píng)估。在第二個(gè)等式中,對(duì)whnf的結(jié)果求值會(huì)導(dǎo)致對(duì)x的求值。
由于x在兩個(gè)分支中都求值,所以這個(gè)函數(shù)在x中是嚴(yán)格的。這有點(diǎn)有趣-它在id嚴(yán)格的方式中是嚴(yán)格的。但這仍然有效!z、 然而,情況就不同了。只有一個(gè)分支導(dǎo)致z被求值,所以它不是嚴(yán)格求值的-它只是根據(jù)需要求值。通常我們會(huì)討論這樣的情況:在構(gòu)造函數(shù)后面保護(hù)求值,或者應(yīng)用函數(shù)而不求值結(jié)果,但是有條件地求值就足夠了。f真1未定義的計(jì)算結(jié)果為真。如果f在z中是嚴(yán)格的,則必須計(jì)算為undefined.- End
免責(zé)聲明:
本頁(yè)內(nèi)容僅代表作者本人意見,若因此產(chǎn)生任何糾紛由作者本人負(fù)責(zé),概與琴島網(wǎng)公司無(wú)關(guān)。本頁(yè)內(nèi)容僅供參考,請(qǐng)您根據(jù)自身實(shí)際情況謹(jǐn)慎操作。尤其涉及您或第三方利益等事項(xiàng),請(qǐng)咨詢專業(yè)人士處理。