比如说,我想像这样定义一个记录属性:
数据属性 = 属性 {name::String, value::Any}
这当然不是有效的 haskell 代码。但是是否有一个类型“Any”基本上表示任何类型都可以?或者是使用类型变量的唯一方法?
数据属性 a = 属性 {name::String, value::a}
最佳答案
一般来说,Any
类型不是很有用。考虑一下:如果你创建一个可以容纳任何内容的多态列表,你可以用列表中的类型做什么?当然,答案是什么 - 您无法保证这些元素有任何共同的操作。
人们通常会做的是:
使用GADTs创建一个可以包含特定类型类元素的列表,如下所示:
data FooWrap where FooWrap :: Foo a => a -> FooWrap type FooList = [FooWrap]
通过这种方法,您不知道元素的具体类型,但您知道可以使用
Foo
类型类的元素来操作它们。创建一个类型以在列表中包含的特定具体类型之间切换:
data FooElem = ElemFoo Foo | ElemBar Bar type FooList = [FooElem]
这可以与方法 1 结合起来创建一个列表,该列表可以容纳属于一组固定类型类之一的元素。
在某些情况下,构建操作函数列表可能会有所帮助:
type FooList = [Int -> IO ()]
这对于事件通知系统之类的东西很有用。在将元素添加到列表时,您将其绑定(bind)在一个函数中,该函数执行您稍后想要执行的任何操作。
使用
Data.Dynamic
(不推荐!)作为作弊。但是,这并不能保证特定元素可以被操作,因此应首选上述方法。
关于haskell - haskell中有类型 'Any'吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6479444/