首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为newtype定义构造函数

为newtype定义构造函数
EN

Stack Overflow用户
提问于 2011-09-03 06:02:06
回答 1查看 534关注 0票数 4

我有一种类型

代码语言:javascript
复制
class IntegerAsType a where
  value :: a -> Integer

data T5
instance IntegerAsType T5 where value _ = 5

newtype (Num a, IntegerAsType n) => PolyRing a n = PolyRing [a]

我一直在寻找一种方法来指定newtype的构造函数。我知道只能有一个,但我不明白为什么我可以指定它是什么。

例如,我可能只想将参数的前三个元素传递给PolyRing值构造函数。

我尝试在newtype声明的末尾使用where子句添加,但没有编译。

我也试过了:

代码语言:javascript
复制
(PolyRing xs) = PolyRing [2, 3, 5, 7]

作为一个玩具的例子。我认为这应该做的是忽略值构造函数的参数,并始终具有值[2,3,5,7]。代码会编译,但我的“自定义”构造函数没有任何作用。

可以为newtype指定构造函数吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-03 06:26:07

我想你要找的是一个Smart constructor

PolyRing的基本大写构造函数不能被重载,但你可以这样做:

代码语言:javascript
复制
polyRing :: (Num a, IntegerAsType n) => [a] -> PolyRing a n
polyRing = PolyRing . take 3

或者,更好的是:

代码语言:javascript
复制
polyRing :: (Num a, IntegerAsType n) => [a] -> Maybe (PolyRing a n)
polyRing (a:b:c:_) = Just $ PolyRing [a, b, c]
polyRing _         = Nothing

为了防止有人直接使用PolyRing构造函数,文件顶部的模块导出声明可能如下所示:

代码语言:javascript
复制
module PolyRing (
 PolyRing (), -- Export the PolyRing type but not constructor
 polyRing     -- Your smart constructor
) where

在OO中,封装的单位是类,但在Haskell中,封装的单位是模块。

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

https://stackoverflow.com/questions/7289627

复制
相关文章

相似问题

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