我一直在尝试制作一类“Strictable”类型。原因是我想定义这样的东西:
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 和s定义实例Float
很容易,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'
. 我想从一个普通的配对中创建一个严格的配对。所以我尝试了这个:
instance (Strictable a, Strictable b) => Strictable (a, b) where
type Strict (a, b) = (! Strict a, ! Strict b)
make_strict (x1, x2) = (make_strict x1, make_strict x2)
不幸的是,我遇到了一堆编译错误。我应该如何实现这个?