首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于ADTs的程序设计

关于ADTs的程序设计
EN

Stack Overflow用户
提问于 2012-07-02 22:36:13
回答 2查看 177关注 0票数 3

我有一种

代码语言:javascript
复制
data Phase = PhaseOne
           | PhaseTwo
           | PhaseThree deriving Enum

每个阶段都要做五次手术

  • read
  • write
  • validate
  • evalStatus
  • update

我开始尝试创建一个类型类。问题是,它们都是同一类型的。我想做些类似的事情

代码语言:javascript
复制
instance MyClass PhaseThree where
  read a = ...

另外,我需要重载返回类型。

我知道类型类不是我想要的。但我不知道怎么做我想做的。我想到了一个GADT,但这并不完全正确,因为我需要能够将每个实例放在一个单独的文件中。

我想听听我需要调查哪些机制的建议?我提供了足够的信息了吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-03 02:46:46

我建议把事情倒过来一点。

代码语言:javascript
复制
data Phase = Phase {
    read :: String -> Foo,
    write :: Foo -> IO (),
    validate :: Foo -> Bool,
    evalStatus :: IO (),
    update :: Foo -> Foo
}

phaseOne, phaseTwo, phaseThree :: Phase

(或类似地将类重组为显式记录)。

票数 2
EN

Stack Overflow用户

发布于 2012-07-03 18:16:00

详细介绍上面的注释,如果您想使用支持您的操作的类的三种不同类型,您可以使用Enum-like类方法构建某种succ功能。

您还必须提供Done类型作为succ PhaseThree的占位符。

代码语言:javascript
复制
{-# 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功能从readwrite等方法中分离出来,并创建两个类。返回值可以是多态的。

succ在您最初发布的公式上是可怕的,因为succ PhaseThree只是抛出一个错误。如果您可以让类型系统为您的应用程序工作,这是理想的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11302082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档