我正在尝试这样做
data Foo a = Foo a
data FooWrapper = FooWrapper (forall a. Foo a)
foo = [FooWrapper (Foo 0), FooWrapper (Foo "")]
但是有一个错误
无法匹配类型
Int
类型
a0
答案 0 :(得分:1)
存在类型在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
的数组。
答案 1 :(得分:0)
我想知道菲尔·弗里曼(Phil Freeman)建议的方法是如何工作的,所以我尝试了一下。这是一个通过使用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
的实例。