Haskell中的多个类型列表

Eva*_*van 2 generics polymorphism haskell types functional-programming

假设我有一组记录,如

data A = A { a:: String } deriving (Show)
data B = B { b:: String } deriving (Show)
Run Code Online (Sandbox Code Playgroud)

然后是一些类型的类

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

instance Foo A where
    foo c = ...
Run Code Online (Sandbox Code Playgroud)

我也想做点什么

bar = do
    push (A {a="x"})
    push (B {b="y"})
Run Code Online (Sandbox Code Playgroud)

并且让这些东西最终放在某个地方,以便稍后运行,这样我就可以

map foo l
Run Code Online (Sandbox Code Playgroud)

我应该编写模板haskell来生成包装器类型并派生实例,以便列表可以是包装器类型吗?有更聪明的方法来解决这个问题吗?我老实说感觉受到haskell类型系统的影响,并且知道必须有更好的方法来做到这一点.

ham*_*mar 15

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

  • 另见[FAQ条目](http://www.haskell.org/haskellwiki/FAQ#I.27m_making_an_RPG._Should_I_define_a_type_for_each_kind_of_monster.2C_and_a_type_class_for_them.3F),以及[链接到的文章](http:// lukepalmer. wordpress.com/2010/01/24/haskell-antipattern-existential-typeclass/). (3认同)
  • 所以你可以把`thingsToDo :: [IO()]`定义为`thingsToDo = [foo A,foo B]`或甚至`stuffToDo :: IO()`with` stuffToDo = foo A >> foo B` (2认同)