2016-03-14 49 views
0

我试图做到这一点如何创建一个具有多态数据的数组?

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

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

但有一个错误

无法比拟型

Int 

a0 
+0

你在做什么?我问,因为如果没有对元素类型的某种约束,具有不同类型元素的数组将不会非常有用。这通常被认为是Haskell中的反模式。 –

+0

'data Foo ab = Foo ab''foo1 :: Foo Int String''foo2 :: Foo Int Int'我该如何创建一个可以与Foo数组一起工作的函数,即使它们的第二个参数具有不同的类型'doSomething [ foo1,foo2]',因为函数只使用第一个参数。 – ais

回答

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阵列。

+0

是否可以使用带有'Exists'的类型约束? 'data FooWrapper = FooWrapper(forall a。Show a => Foo a)'例如,如何从[(mkExists(Foo 0)),(())获得'[“0”,“”] mkExists(Foo“”))]'? – ais

+0

是的,你需要以某种方式将字典添加到包装类型中。另一种方法是使用'forall'对存在类型进行编码,例如'输入SomeShow = forall r。 (a。显示a => a - > r) - > r'。 –

+0

@PhilFreeman你能展示一个完整的'getStrings'代码吗?http://stackoverflow.com/questions/36006483/how-to-use-type-constrains-with-exists? – ais

相关问题