假设我有一组记录,如
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/