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
的外观取决于哪个阶段。谢谢!我要带着这个跑。我想这正是我需要的。