0

我正在尝试这样做

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

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

但是有一个错误

无法匹配类型

Int

带类型

a0
4

2 回答 2

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.

于 2016-03-14T15:29:50.257 回答
0

我想知道菲尔弗里曼建议的方法是如何工作的,所以我试了一下。这是一个使用 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为类型本身创建一个实例。

于 2020-05-01T07:36:03.207 回答