2016-01-03 50 views

回答

6

正如你可以在Haskell Wiki entry on seq看到,seq功能必須滿足以下兩個公式:

⊥ `seq` b = ⊥ 
a `seq` b = b 

(其中是不確定的狀態,這就是是非終止功能的應用或事物如hd []undefined評估邏輯)

您的定義顯然不符合第一個等式。

seq的典型用例是在評估第二個參數之前強制評估第一個參數(對於弱頭標準形式)。 (儘管嚴格來說,seq並不能保證;再次看到這篇wiki文章)

就我所知,這樣的函數在沒有任何編譯器擴展如-XBangPatterns的純Haskell中是不可定義的。

+0

BangPatterns只是一個擴展,它們可以/將被case case語句替換爲一個case。 – sdx23

+1

我說他們不是擴展名嗎?通過'case'聲明,你的意思是在GHC核心輸出中?是的,這就是我期望會發生的事情,但我仍然不知道如何在Haskell中不使用內置的'seq'或類似'BangPatterns'的東西來實現這一點。 –

+2

@ sdx23通常情況並非如此:函數值表達式不能被Haskell中的case所強制(與GHC Core不同,case'的確評估了這一點)。您可以爲所有代數數據類型定義類似seq的函數,方法是通過與構造函數進行模式匹配:對於該「case」,確實足夠了。 – chi