如何创建包含多态数据的数组?

时间:2016-03-14 14:20:22

标签: purescript

我正在尝试这样做

data Foo a = Foo a
data FooWrapper = FooWrapper (forall a. Foo a)

foo = [FooWrapper (Foo 0), FooWrapper (Foo "")]

但是有一个错误

  

无法匹配类型

Int
     

类型

a0

2 个答案:

答案 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的实例。