我试图做到这一点如何创建一个具有多态数据的数组?
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
阵列。
是否可以使用带有'Exists'的类型约束? 'data FooWrapper = FooWrapper(forall a。Show a => Foo a)'例如,如何从[(mkExists(Foo 0)),(())获得'[“0”,“”] mkExists(Foo“”))]'? – ais
是的,你需要以某种方式将字典添加到包装类型中。另一种方法是使用'forall'对存在类型进行编码,例如'输入SomeShow = forall r。 (a。显示a => a - > r) - > r'。 –
@PhilFreeman你能展示一个完整的'getStrings'代码吗?http://stackoverflow.com/questions/36006483/how-to-use-type-constrains-with-exists? – ais
你在做什么?我问,因为如果没有对元素类型的某种约束,具有不同类型元素的数组将不会非常有用。这通常被认为是Haskell中的反模式。 –
'data Foo ab = Foo ab''foo1 :: Foo Int String''foo2 :: Foo Int Int'我该如何创建一个可以与Foo数组一起工作的函数,即使它们的第二个参数具有不同的类型'doSomething [ foo1,foo2]',因为函数只使用第一个参数。 – ais