generics - Haskell 中多种类型的列表

标签 generics haskell types functional-programming polymorphism

假设我有一组记录,如

data A = A { a:: String } deriving (Show)
data B = B { b:: String } deriving (Show)

然后是一些类型类

class Foo a where
    foo :: a -> IO ()

instance Foo A where
    foo c = ...

我也想做类似的事情

bar = do
    push (A {a="x"})
    push (B {b="y"})

然后把这些东西放在列表 l 中的某个地方,以便稍后运行,这样我就可以

map foo l

我是否应该编写模板 haskell 来生成包装器类型并派生实例,以便列表可以是包装器类型?有没有更聪明的方法来解决这个问题?老实说,我觉得 haskell 类型系统让我束手无策,并且知道必须有更好的方法来做到这一点。

最佳答案

有一些方法可以通过存在量化来做到这一点,但它通常是矫枉过正的。一种更像 Haskell 的方法是简单地在前面应用 foo 并保留结果操作的 [IO ()] 列表,然后你可以 sequence 稍后运行它们。

关于generics - Haskell 中多种类型的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12865623/

相关文章:

haskell - Haskell中自动函数约束推导的类型约束

Java 泛型的奇怪行为

java - 仅适用于特定类型的通用类

haskell - 自定义 Prelude 模块——坏主意?

haskell - Miranda To Haskell - 改进版本是什么?

c# - 初始化未知类型的通用对象

java - 为什么我在编译时遇到类型不匹配的问题

powershell - 什么是 List`1 对象?

java - Camel::Generic List<Enum> 转换器

c# - 泛型类中的可空泛型字段