我有一种
data Phase = PhaseOne
| PhaseTwo
| PhaseThree deriving Enum每个阶段都要做五次手术
readwritevalidateevalStatusupdate我开始尝试创建一个类型类。问题是,它们都是同一类型的。我想做些类似的事情
instance MyClass PhaseThree where
read a = ...另外,我需要重载返回类型。
我知道类型类不是我想要的。但我不知道怎么做我想做的。我想到了一个GADT,但这并不完全正确,因为我需要能够将每个实例放在一个单独的文件中。
我想听听我需要调查哪些机制的建议?我提供了足够的信息了吗?
发布于 2012-07-03 02:46:46
我建议把事情倒过来一点。
data Phase = Phase {
read :: String -> Foo,
write :: Foo -> IO (),
validate :: Foo -> Bool,
evalStatus :: IO (),
update :: Foo -> Foo
}
phaseOne, phaseTwo, phaseThree :: Phase(或类似地将类重组为显式记录)。
发布于 2012-07-03 18:16:00
详细介绍上面的注释,如果您想使用支持您的操作的类的三种不同类型,您可以使用Enum-like类方法构建某种succ功能。
您还必须提供Done类型作为succ PhaseThree的占位符。
{-# LANGUAGE MultiParamTypeClasses , FunctionalDependencies #-}
data PhaseOne = PhaseOne
data PhaseTwo = PhaseTwo
data PhaseThree = PhaseThree
data Done = Done
class YourClass p0 p1 | p0 -> p1 where
succ :: p0 -> p1
-- read :: ...
-- write :: ...etc
instance YourClass PhaseOne PhaseTwo where
succ PhaseOne = PhaseTwo
-- read = ...
instance YourClass PhaseTwo PhaseThree where
succ PhaseTwo = PhaseThree
instance YourClass PhaseThree Done where
succ PhaseThree = Done您可以将Succ功能从read、write等方法中分离出来,并创建两个类。返回值可以是多态的。
succ在您最初发布的公式上是可怕的,因为succ PhaseThree只是抛出一个错误。如果您可以让类型系统为您的应用程序工作,这是理想的。
https://stackoverflow.com/questions/11302082
复制相似问题