我正在编写一个作为守护进程运行的程序.要创建守护程序,用户为每个必需的类提供一组实现(其中一个是数据库)所有这些类的函数都具有表单的类型签名StateT s IO a,但s每个类都有所不同.
假设每个类都遵循以下模式:
import Control.Monad (liftM)
import Control.Monad.State (StateT(..), get)
class Hammer h where
driveNail :: StateT h IO ()
data ClawHammer = MkClawHammer Int -- the real implementation is more complex
instance Hammer ClawHammer where
driveNail = return () -- the real implementation is more complex
-- Plus additional classes for wrenches, screwdrivers, etc.
Run Code Online (Sandbox Code Playgroud)
现在我可以定义一条记录,表示用户为每个"槽"选择的实现.
data MultiTool h = MultiTool {
hammer :: h
-- Plus additional fields for wrenches, screwdrivers, etc.
} …Run Code Online (Sandbox Code Playgroud)