【发布时间】:2014-10-08 10:53:16
【问题描述】:
我在理解如何处理 Haskell 中的方法等接口时遇到问题。如果用 OOP 术语考虑它,那么我希望不同的对象实现相同的接口(只是几个方法)并跟踪一些内部状态。
我从一些类型类开始
class FileTransformer where
doThis :: a -> b -> c
doThat :: d -> e -> f
如果我会创建不同的数据类型,比如
data FirstThingy = FirstThingy { internalState :: STRef s Int } -- simplified
data SecondThingy = SecondThingy { differentState :: STRef s Word8 } -- simplified
instance FileTransformer FirstThingy where
doThis = ... -- does some stuff with internal state also
doThat = ... -- does some stuff with internal state also
-- implementation of doThis and doThat is different from the above one
instance FileTransformer SecondThingy where
doThis = ... -- does some stuff with internal state also
doThat = ... -- does some stuff with internal state also
然后我认为这样做就足够了:
firstThingy = FirstThingy someInitialState
secondThingy = SecondThingy someOtherInitialState
loadFileTransformer :: FileTransformer ft => FileHeader -> ft
loadFileTransformer header = if simple header then firstThingy else secondThingy
不过,你可能已经猜到这行不通了……
那么,问题是 Haskell 中的什么方法可以让我根据某些特定需求选择不同的文件转换器?每个转换器必须有 2 个方法(但有不同的实现),并且还可以有一些内部状态(与彼此相比时非常不同)。
【问题讨论】: