首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是榆树的不透明类型,为什么它是有价值的?

什么是榆树的不透明类型,为什么它是有价值的?
EN

Stack Overflow用户
提问于 2016-11-24 20:55:19
回答 1查看 1.3K关注 0票数 15

我以前用过类型,但不知道什么是不透明类型。我也见过有人提到。公开不透明类型比类型别名更好吗?

EN

回答 1

Stack Overflow用户

发布于 2016-11-24 20:55:19

让我们首先看一下类型别名来回答这个问题:

类型别名完全透明。这意味着导入它的任何其他模块都可以完全访问其内部工作。假设我们有一个User模块公开了一个User类型:

代码语言:javascript
复制
module User exposing User

type alias User =
    { userName : String
    , age : Int
    }

任何导入User的人都可以操纵数据,例如newUser = { oldUser | age = 25 }。或者做someUser = User "Bill" 27。当您控制它们存在的上下文时,这些操作是很好的。

但是,如果User是库的一部分,那么对User类型的每一次更改对使用该库的人来说都是一个重大变化。例如,如果将email字段添加到User中,则构造函数示例(someUser = User "Bill" 27)将给出编译器错误。

即使在项目代码库中,类型别名也可能向其他模块提供太多信息,从而导致代码难以维护和发展。也许User在某一点上发生了剧烈的变化,并且具有一组全新的属性。这将需要在代码操作User的地方进行更改。

不透明类型是有价值的,因为它们避免了这些问题。下面是User的一个不透明版本

代码语言:javascript
复制
module User exposing User

type User =
    User
        { userName : String
        , age : Int
        }

使用此版本,其他模块无法直接访问或操作数据。通常,这意味着您将生成并公开一些getter和函数:

代码语言:javascript
复制
initUser : String -> Int -> User
userName : User -> String
age : User -> String
setAge : Int -> User -> User

这是更多的工作,但也有其优点:

  • 其他模块只关心User函数,不需要知道类型中的数据
  • 可以在不中断包含模块之外的代码的情况下更新类型。

这种解释大部分来自于@wintveltelmlang.slack.com

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

https://stackoverflow.com/questions/40794368

复制
相关文章

相似问题

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