【问题标题】:What is an opaque type in Elm and why is it valuable?Elm 中的不透明类型是什么,为什么它很有价值?
【发布时间】:2016-11-24 20:55:19
【问题描述】:

我以前使用过类型,但不知道什么是不透明类型。我也看到提到过。暴露一个不透明的类型比暴露一个类型别名更好吗?

【问题讨论】:

    标签: elm


    【解决方案1】:

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

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

    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 在某些时候会发生巨大变化,并具有一组全新的属性。这将需要在代码操纵Users 的任何地方进行更改。

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

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

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

    initUser : String -> Int -> User
    userName : User -> String
    age : User -> String
    setAge : Int -> User -> User
    

    这是更多的工作,但它有优势:

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

    这个解释大部分来自@wintvelt:elmlang.slack.com

    【讨论】:

    • 这里有更多关于库和包的作者关于价值的讨论:package.elm-lang.org/help/…
    • 感谢分享这个解释。因为其中大约一半是我之前在 Slack (here) 上发布的答案的精确副本,所以提及或链接会很好。
    • 嘿@wintvelt:对不起!我认为这是一个非常好的答案,对住在一个更永久的地方会有帮助。我添加了对您的 SO 帐户的引用。也许 SO 模组可以将您添加为作者?
    • 感谢您的提及。欣赏它。在这种情况下,通常的做法是 - 我认为 - 至少添加一个指向您的来源的链接(链接已经在我的评论中:)。
    猜你喜欢
    • 1970-01-01
    • 2017-12-05
    • 2016-07-17
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    相关资源
    最近更新 更多