haskell - haskell中有类型 'Any'吗?

标签 haskell

比如说,我想像这样定义一个记录属性:

数据属性 = 属性 {name::String, value::Any}

这当然不是有效的 haskell 代码。但是是否有一个类型“Any”基本上表示任何类型都可以?或者是使用类型变量的唯一方法?

数据属性 a = 属性 {name::String, value::a}

最佳答案

一般来说,Any 类型不是很有用。考虑一下:如果你创建一个可以容纳任何内容的多态列表,你可以用列表中的类型做什么?当然,答案是什么 - 您无法保证这些元素有任何共同的操作。

人们通常会做的是:

  1. 使用GADTs创建一个可以包含特定类型类元素的列表,如下所示:

    data FooWrap where
        FooWrap :: Foo a => a -> FooWrap
    type FooList = [FooWrap]
    

    通过这种方法,您不知道元素的具体类型,但您知道可以使用 Foo 类型类的元素来操作它们。

  2. 创建一个类型以在列表中包含的特定具体类型之间切换:

    data FooElem = ElemFoo Foo | ElemBar Bar
    type FooList = [FooElem]
    

    这可以与方法 1 结合起来创建一个列表,该列表可以容纳属于一组固定类型类之一的元素。

  3. 在某些情况下,构建操作函数列表可能会有所帮助:

    type FooList = [Int -> IO ()]
    

    这对于事件通知系统之类的东西很有用。在将元素添加到列表时,您将其绑定(bind)在一个函数中,该函数执行您稍后想要执行的任何操作。

  4. 使用Data.Dynamic(不推荐!)作为作弊。但是,这并不能保证特定元素可以被操作,因此应首选上述方法。

关于haskell - haskell中有类型 'Any'吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6479444/

相关文章:

performance - 手指树(Data.Sequence)与绳索(Data.Rope)(Haskell,或一般情况下)

haskell - 为什么 "cabal update"这么慢,我可以手动完成吗?

haskell - 如何编写状态 Monad 的实例

haskell - 从 monad 中取出 monadic 函数

haskell - 从 Haskell 中的数据类型中提取字段

haskell - 仅适用于一种类型的一个构造函数的函数

haskell - 函数输入类型

haskell - (Num a) vs 整数类型推断

Haskell 打印不带换行符的字符串

haskell - 与分数相关的类型错误