榆木类型的困惑

时间:2018-08-13 01:26:33

标签: elm

我从Elm的第一个简单的Web应用程序开始。目前,我的大部分代码都来自https://github.com/rtfeldman/elm-spa-example。我正在使用一个API,该API将在响应标头中提供authToken。我有一个AuthToken类型,应该代表该令牌。从标题中取出值并将其转换为错误StringAuthToken的结果会造成麻烦。我以为我可以说我要返回一个AuthToken,返回一个String,这很好,因为我的AuthTokens现在只是Strings。似乎很明显我不了解榆木类型。

这是AuthToken的定义:

type AuthToken
  = AuthToken String

而且我的函数太复杂了,以至于现在只尝试做一些类型更改(后来我也想在这里对身体进行处理):

authTokenFromHeader : String -> Http.Response String -> Result String AuthToken
authTokenFromHeader name resp =
    let
        header = extractHeader name resp
    in
    case header of
        Ok header ->
            let
                token : Result String AuthToken
                token = Ok (AuthToken header)
            in
            token
        Err error -> Err error

我希望这种情况会返回Ok结果,并将响应标头中的字符串转换为AuthToken作为其值。相反,我得到Cannot find variable 'AuthToken'。从文档中,我希望获得一个与类型同名的构造函数。如果我仅使用Ok header,则编译器会感到不满意,因为我将返回Result String String而不是承诺的Result String AuthToken

这里正确的方法是什么?

1 个答案:

答案 0 :(得分:4)

代码按原样看起来不错。错误消息指示type AuthToken已在其他模块中定义,并且未完全导入到定义authTokenFromHeader的模块中。您可以在Elm指南中找到有关Elm的模块系统的信息:Modules

假设type AuthToken在模块Types中定义并且authTokenFromHeader在模块Net中定义,可能的解决方法是:

Types.elm:

module Types exposing (AuthToken(..))

type AuthToken = AuthToken String

Net.elm:

module Net exposing (authTokenFromHeader)

import Types exposing (AuthToken(..))

authTokenFromHeader : String -> Http.Response String -> Result String AuthToken
authTokenFromHeader name resp =
    ...

请注意,使用AuthToken(..)而非仅使用AuthToken,这样可以确保类型和类型构造函数的导入/导出。

或者仅将type AuthToken的定义移至与authTokenFromHeader的定义相同的文件中。