3 回答

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超10個(gè)贊
這是一個(gè)嚴(yán)格的聲明?;旧?,這意味著在創(chuàng)建數(shù)據(jù)結(jié)構(gòu)值時(shí),必須將其評(píng)估為所謂的“弱頭范式”。讓我們看一個(gè)示例,以便我們可以看到這意味著什么:
data Foo = Foo Int Int !Int !(Maybe Int)
f = Foo (2+2) (3+3) (4+4) (Just (5+5))
f上面的函數(shù)在被求值時(shí)將返回“ thunk”:即,執(zhí)行以確定其值的代碼。到那時(shí),F(xiàn)oo甚至還不存在,僅存在代碼。
但是在某些時(shí)候,可能有人會(huì)嘗試通過模式匹配來查看其中的內(nèi)容:
case f of
Foo 0 _ _ _ -> "first arg is zero"
_ -> "first arge is something else"
這將執(zhí)行足夠的代碼來執(zhí)行所需的工作,僅此而已。因此它將創(chuàng)建具有四個(gè)參數(shù)的Foo(因?yàn)槿绻麤]有它,您將無法在其中查看內(nèi)容)。首先,因?yàn)槲覀冋跍y試它,所以我們需要一直評(píng)估到4,直到我們發(fā)現(xiàn)它不匹配。
第二個(gè)不需要評(píng)估,因?yàn)槲覀儧]有測試它。因此,6我們不會(huì)將代碼存儲(chǔ)在該內(nèi)存位置中,而是將其存儲(chǔ)以用于以后的評(píng)估(3+3)。僅當(dāng)有人看時(shí),它就會(huì)變成6。
但是,第三個(gè)參數(shù)!在其前面,因此必須進(jìn)行嚴(yán)格評(píng)估:(4+4)已執(zhí)行并8存儲(chǔ)在該內(nèi)存位置。
第四個(gè)參數(shù)也被嚴(yán)格評(píng)估。但是,這里有些棘手:我們沒有完全評(píng)估,只是評(píng)估了弱勢的正常頭型。這意味著我們要弄清楚是什么Nothing還是Just某種東西,并將其存儲(chǔ)起來,但是我們走得更遠(yuǎn)了。這意味著我們Just 10實(shí)際上不是存儲(chǔ)而是Just (5+5)保留其中的雜物未被評(píng)估。要知道這一點(diǎn)很重要,盡管我認(rèn)為這的所有含義都超出了此問題的范圍。
如果啟用BangPatterns語言擴(kuò)展,則可以用相同的方式注釋函數(shù)參數(shù):
f x !y = x*y
f (1+1) (2+2)會(huì)歸還笨拙的(1+1)*4。

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超8個(gè)贊
我相信這是嚴(yán)格的注解。
Haskell是一種純粹且懶惰的函數(shù)式語言,但有時(shí)懶惰的開銷可能過多或浪費(fèi)。因此,為了解決這個(gè)問題,您可以要求編譯器完全評(píng)估函數(shù)的參數(shù),而不是解析亂碼。
添加回答
舉報(bào)