Bu bir katılık beyanı. Temel olarak, veri yapısı değeri yaratıldığında "zayıf kafa normal formu" olarak değerlendirilmesi gerektiği anlamına gelir. Bir örneğe bakalım, böylece bunun ne anlama geldiğini görebilelim:
data Foo = Foo Int Int !Int !(Maybe Int)
f = Foo (2+2) (3+3) (4+4) (Just (5+5))
İşlev f
, değerlendirildiğinde bir "thunk" döndürür: yani değerini bulmak için çalıştırılacak kod. Bu noktada, bir Foo henüz mevcut değil, sadece kod.
Ancak bir noktada, biri muhtemelen bir desen eşleşmesi yoluyla içine bakmaya çalışabilir:
case f of
Foo 0 _ _ _ -> "first arg is zero"
_ -> "first arge is something else"
Bu, ihtiyaç duyduğu şeyi yapmak için yeterli kod yürütecek ve daha fazla olmayacak. Böylece dört parametreli bir Foo oluşturacaktır (çünkü mevcut olmadan içine bakamazsınız). Birincisi, test ettiğimiz için, aşağıdakileri değerlendirmek zorundayız:4
, eşleşmediğini fark ettiğimiz .
İkincisinin değerlendirilmesi gerekmez, çünkü test etmiyoruz. Bu nedenle, 6
o bellek konumunda depolanmak yerine , kodu daha sonra olası değerlendirme için saklayacağız (3+3)
. Bu sadece birisi bakarsa 6'ya dönüşecektir.
Bununla birlikte, üçüncü parametrenin !
önünde bir tane vardır, bu yüzden kesinlikle değerlendirilir: (4+4)
yürütülür ve 8
bu bellek konumunda saklanır.
Dördüncü parametre de kesinlikle değerlendirilir. Ama burada biraz zorlaşıyor: tam olarak değil, sadece zayıf normal kafa formunu değerlendiriyoruz. Bu, bunun Nothing
ya da bir Just
şeyin olup olmadığını anladığımız ve sakladığımız anlamına gelir, ancak daha fazla ilerlemeyiz. Bu, depolamayı değerlendirmeden değil Just 10
aslında sakladığımız anlamına gelir Just (5+5)
. Bunu bilmek önemlidir, ancak bunun tüm sonuçlarının bu sorunun kapsamının çok ötesine geçtiğini düşünüyorum.
BangPatterns
Dil uzantısını etkinleştirirseniz, işlev bağımsız değişkenlerine aynı şekilde açıklama ekleyebilirsiniz :
f x !y = x*y
f (1+1) (2+2)
thunk dönecektir (1+1)*4
.