如何初始化类型别名?

时间:2019-08-01 07:50:55

标签: elm

如何在Elm中初始化类型别名?

模型在下面。

type alias Model =
    { name : String
    , tags : List Tag
    , token : Token
    , jwt : String 
    }

令牌在下面。

type alias Token =
    { accessToken : String
    }

我尝试如下进行初始化。

init : String -> ( Model, Cmd Msg )
init flags =
    ( Model "" [] "" "", Cmd.none )

但是,会发生类似

的错误
The 3rd argument to `Model` is not what I expect:

55|     ( Model "" [] "" "", Cmd.none )
                      ^^
This argument is a string of type:

    String

But `Model` needs the 3rd argument to be:

    Token

我知道第三个参数不是字符串。 但是,我只是不知道如何在init函数中初始化自定义类型。

有人知道怎么做吗?

1 个答案:

答案 0 :(得分:5)

您有两个选择来初始化类型别名。首先,就像在与Model一起使用时一样,是将别名视为构造函数。要进行此内联,您需要将其用括号括起来:

Model "" [] (Token "") ""

您也可以采用这种方法,但在单独的行中对其进行初始化:

let
    initialToken =
        Token ""
in
Model "" [] initialToken ""

如果通常可以使用initialToken(例如,将init的版本为Model很有用),那么您可能希望将其作为顶层声明从模块中导出,而不是将其隐藏在let中。或者,Token可以成为自己的模块,而自己的init可以公开。

第二个选择是直接构造类型而不使用别名。在这种情况下,这意味着创建带有accessToken字段的记录:

Model "" [] { accessToken = "" } ""