2012-06-19 29 views
3

我一直在嘗試創建一類'可嚴格限制'類型。是的原因是,我想定義是這樣的:Haskell:定義嚴格的數據

foldl'' f z = foldl' f (make_strict z) 

所以當fold''上一個strictable類型使用,也不會有未評估的thunk。

所以我已經開始與以下:

{-# LANGUAGE TypeFamilies #-} 

class Strictable a where 
    type Strict a :: * 
    make_strict :: a -> Strict a 

定義實例以Int S和Float s是容易的,foldl'正常工作與這些了,所以沒有什麼可以做。

instance Strictable Int where 
    type Strict Int = Int 
    make_strict = id 

instance Strictable Float where 
    type Strict Float = Float 
    make_strict = id 

這是棘手的部分。 foldl'只展開最外層的構造函數,因此例如對於一對,仍然可以使用foldl'獲得空間泄漏。我想從一對普通的對中創建一個嚴格的對。所以我試過這個:

不幸的是我有一堆編譯錯誤。我應該如何實現這一點?

回答

3

你在找什麼like this?即使用關聯的數據,而不是類型同義詞。

instance AdaptPair Bool Bool where 
    data Pair Bool Bool = PBool {-# UNPACK #-}!Int {-# UNPACK #-}!Int 

    fst (PBool x _) = Prelude.toEnum x 
    snd (PBool _ x) = Prelude.toEnum x 
    curry f x y = f (PBool (Prelude.fromEnum x) (Prelude.fromEnum y)) 

您將需要使用關聯的數據類型而不是類型同義詞來添加所需的嚴格標註。當你在那裏的時候,你也可以明確地解開一些單調的類型。

在此之後,添加爆炸模式的泛型實例很容易。

2

如果我正確理解你的問題,並且我對parallel strategies(PDF鏈接)的理解不會使我失敗,那麼並行策略可以直接實現你的make_strict;請參閱parallel package瞭解API和並行策略的實現。

事實上,從Control.Parallel.Strategiesrdeepseq strategy可能正是你在找什麼。

儘管在名稱中「平行」的,這真的評估通過利用懶惰聲明方式計算,然後遞歸降下來的數據結構有選擇地應用像seqparpseq其元素實現的功能策略。

+0

是的,他的嚴格類型類基本上是[Haskell 1.2的'Eval'類](http://www.haskell.org/definition/from12to13.html#strict) - 並且par策略與。 –