2
在definition of the haskell prelude中,我們看到...
保留給無法在Haskell中實現的表達式。現在,例如IO
monad無法在haskell中實現。haskell前奏:seq的定義
讓我吃驚的是,seq
被定義爲前奏
seq :: a -> b -> b
seq = ... -- Primitive
如下何不以下?我錯過了什麼?
seq _ b = b
在definition of the haskell prelude中,我們看到...
保留給無法在Haskell中實現的表達式。現在,例如IO
monad無法在haskell中實現。haskell前奏:seq的定義
讓我吃驚的是,seq
被定義爲前奏
seq :: a -> b -> b
seq = ... -- Primitive
如下何不以下?我錯過了什麼?
seq _ b = b
正如你可以在Haskell Wiki entry on seq
看到,seq
功能必須滿足以下兩個公式:
⊥ `seq` b = ⊥
a `seq` b = b
(其中⊥
是不確定的狀態,這就是是非終止功能的應用或事物如hd []
和undefined
評估邏輯)
您的定義顯然不符合第一個等式。
seq
的典型用例是在評估第二個參數之前強制評估第一個參數(對於弱頭標準形式)。 (儘管嚴格來說,seq
並不能保證;再次看到這篇wiki文章)
就我所知,這樣的函數在沒有任何編譯器擴展如-XBangPatterns
的純Haskell中是不可定義的。
BangPatterns只是一個擴展,它們可以/將被case case語句替換爲一個case。 – sdx23
我說他們不是擴展名嗎?通過'case'聲明,你的意思是在GHC核心輸出中?是的,這就是我期望會發生的事情,但我仍然不知道如何在Haskell中不使用內置的'seq'或類似'BangPatterns'的東西來實現這一點。 –
@ sdx23通常情況並非如此:函數值表達式不能被Haskell中的case所強制(與GHC Core不同,case'的確評估了這一點)。您可以爲所有代數數據類型定義類似seq的函數,方法是通過與構造函數進行模式匹配:對於該「case」,確實足夠了。 – chi