小编Ell*_*son的帖子

ADTs与Typeclasses - 规范使用

我在某个数据结构的两个实现之间徘徊,并且从Haskell社区输入关于什么是正确/标准的信息将被赞赏.

数据类型

举例来说,ADT"服务器"将多个服务器定义为nullary数据构造函数.

data Server = Server1
            | Server2
            | Server3
Run Code Online (Sandbox Code Playgroud)

现在,对于这些服务器中的每一个,我希望(除其他外)获得IP地址的能力.假设我可以静态编码,我可以有一些函数"getURL"和模式匹配.

getUrl :: Server -> String
getUrl Server1 = "192.168.1.1"
Run Code Online (Sandbox Code Playgroud)

现在任何使用服务器的函数都可以将Server放入类型中并调用getURL.

serverStuff :: Server -> IO ()
Run Code Online (Sandbox Code Playgroud)

这种方法似乎具有简单的非多态函数的好处,代价是在getURL中有大量的模式匹配.此外,如果程序员添加了一个服务器但忘记将模式添加到getURL,除非用-Wall编译,否则它们将在没有警告的情况下获得运行时错误.

类型类

使用类型类攻击同样的问题,我可以将我的多构造函数ADT分解为一组特定于服务器的ADT,并为URL创建一个类型类.

data Server1 = Server1
data Server2 = Server2
data Server3 = Server3

class Server a where
    getUrl :: a -> String

instance Server Server1 where
    getUrl Server1 = "192.168.1.1"
Run Code Online (Sandbox Code Playgroud)

而不是我之前使用的简单的非多态函数,我必须创建类似的东西

serverStuff :: Server a => a -> IO ()
Run Code Online (Sandbox Code Playgroud)

并处理ad-hoc多态性(函数专业化等)的含义.

从好的方面来说,类型类方法易于扩展,将模式匹配分解为更小的块,允许更大的抽象,例如分组服务器(data ServerCenter1 = Server1 | Server2 | Server3 …

haskell

8
推荐指数
1
解决办法
573
查看次数

标签 统计

haskell ×1