Haskell 关于ADTs的程序设计
我有一种Haskell 关于ADTs的程序设计,haskell,Haskell,我有一种 data Phase = PhaseOne | PhaseTwo | PhaseThree deriving Enum 每个阶段要做五个操作 读取 write 验证 evalStatus 更新 我开始尝试创建一个类型类。问题是,它们都是同一类型的。 我希望能做一些类似的事情 instance MyClass PhaseThree where read a = ... 另外,我需要重载返回类型 我知道类型类不是我想要的。但我不知道该
data Phase = PhaseOne
| PhaseTwo
| PhaseThree deriving Enum
每个阶段要做五个操作
读取
write
验证
evalStatus
更新
instance MyClass PhaseThree where
read a = ...
另外,我需要重载返回类型
我知道类型类不是我想要的。但我不知道该怎么做。我想
但这并不完全正确,因为我需要能够将每个实例放在一个单独的文件中
我想要一些关于我需要调查哪些机制的建议?我已经提供了足够的信息了吗?我建议稍微颠倒一下
data Phase = Phase {
read :: String -> Foo,
write :: Foo -> IO (),
validate :: Foo -> Bool,
evalStatus :: IO (),
update :: Foo -> Foo
}
phaseOne, phaseTwo, phaseThree :: Phase
(或者类似地将类重新组合成显式记录)。在我上面的评论中详细说明,如果您想在支持您的操作的类中使用三种不同的类型,您可以使用
succ
类方法在枚举
类功能中进行排序
您还必须提供一个Done
类型作为succphaseThree
{-# 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
只是抛出一个错误。如果您可以让类型系统为您的应用程序工作,这是理想的。如果您为readPhaseOne
、readphaseTo
、writePhaseOne
、writePhaseTwo
等定义单独的函数,它们的类型会是什么?如果您有更多的信息,这会有所帮助。你到底想达到什么目的?为什么普通模式匹配不起作用?为什么阶段需要一种类型而不是三种类型?Phillip:我想做的是基于上述操作制作一个eDSL。普通模式匹配不起作用,因为我试图重载返回类型。阶段需要是枚举类型(需要succ方法),因此只能是一种类型而不是三种类型(AFAIK)。对于这些阶段中的每一个read
都不会非常有用,是吗?它只能是read=const-PhaseOne
,read=const-PhaseTwo
和read=const-PhaseThree
。好吧,我试图简化问题描述,但没有遗漏相关信息。但我似乎一直在发现我遗漏的重要细节。在这种情况下,read
的外观取决于哪个阶段。谢谢!我要带着这个跑。我想这正是我需要的。