如何初始化类型别名?

ton*_*eki 1 elm

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

型号如下。

type alias Model =
    { name : String
    , tags : List Tag
    , token : Token
    , jwt : String 
    }
Run Code Online (Sandbox Code Playgroud)

令牌在下面。

type alias Token =
    { accessToken : String
    }
Run Code Online (Sandbox Code Playgroud)

我尝试如下初始化。

init : String -> ( Model, Cmd Msg )
init flags =
    ( Model "" [] "" "", Cmd.none )
Run Code Online (Sandbox Code Playgroud)

但是,会发生类似的错误

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
Run Code Online (Sandbox Code Playgroud)

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

有人知道怎么做吗?

bdu*_*kes 5

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

Model "" [] (Token "") ""
Run Code Online (Sandbox Code Playgroud)

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

let
    initialToken =
        Token ""
in
Model "" [] initialToken ""
Run Code Online (Sandbox Code Playgroud)

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

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

Model "" [] { accessToken = "" } ""
Run Code Online (Sandbox Code Playgroud)