我正在尝试这样做
data Foo a = Foo a
data FooWrapper = FooWrapper (forall a. Foo a)
foo = [FooWrapper (Foo 0), FooWrapper (Foo "")]
但是有一个错误
无法匹配类型
Int
带类型
a0
我正在尝试这样做
data Foo a = Foo a
data FooWrapper = FooWrapper (forall a. Foo a)
foo = [FooWrapper (Foo 0), FooWrapper (Foo "")]
但是有一个错误
无法匹配类型
Int
带类型
a0
存在类型在 PureScript 中的工作方式与在 Haskell 中的工作方式不同,因此我们通常将purescript-exists
库用于此类事情。
等效的使用Exists
将是:
import Data.Exists (Exists(), mkExists)
data Foo a = Foo a
data FooWrapper = FooWrapper (Exists Foo)
foo = [FooWrapper (mkExists (Foo 0)), FooWrapper (mkExists (Foo ""))]
我想在这种情况下,您可能根本不需要FooWrapper
,可能只需要一个Exists Foo
.
我想知道菲尔弗里曼建议的方法是如何工作的,所以我试了一下。这是一个使用 rank-n 类型存储类型类实例及其值的工作示例。
module Example where
import Prelude (class Show, Unit, discard, pure, show, unit, ($))
import Effect (Effect)
import Effect.Console (log)
newtype Showable = Showable (forall r. (forall a. Show a => a -> r) -> r)
instance showShowable :: Show Showable where
show (Showable f) = f show
mkShowable :: forall s . Show s => s -> Showable
mkShowable s = Showable (\f -> f s)
showables :: Array Showable
showables = [mkShowable 1, mkShowable "a string", mkShowable { foo : "bar" } ]
main :: Effect Unit
main = do
log $ show showables
pure unit
存储并不是真正需要的newtype
,但我想Show
为类型本身创建一个实例。