首页 > 解决方案 > 榆树类型混淆

问题描述

我在 Elm 中开始了我的第一个简单的 Web 应用程序。我的大部分代码目前改编自https://github.com/rtfeldman/elm-spa-example。我正在使用一个 API,它将在响应标头中给我一个 authToken。我有一个应该代表该令牌的 AuthToken 类型。从标头中取出值并将其转换为错误StringAuthToken导致麻烦的结果。我希望我可以说我正在返回一个 AuthToken,返回一个字符串,这很好,因为我现在的 AuthToken 只是字符串。似乎很明显,我不了解 Elm 类型。

这是 的定义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 结果,并将响应标头中的字符串转换为 aAuthToken作为其值。相反,我得到了Cannot find variable 'AuthToken'. 从文档中我希望得到一个与类型同名的构造函数。如果我只是使用Ok header,编译器会不高兴,因为我返回Result String String而不是承诺Result String AuthToken

这里的正确方法是什么?

标签: elm

解决方案


代码看起来很好。错误消息表明type AuthToken已在不同的模块中定义,并且未完全导入到定义authTokenFromHeader. 您可以在 Elm 指南: Modules中阅读有关 Elm 的模块系统的信息。

假设type AuthToken在 module中定义Types并在 module 中定义,可能的修复是:authTokenFromHeaderNet

类型.榆树:

module Types exposing (AuthToken(..))

type AuthToken = AuthToken String

网络榆树:

module Net exposing (authTokenFromHeader)

import Types exposing (AuthToken(..))

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

请注意使用 ofAuthToken(..)而不是 just AuthToken,这可确保导入/导出类型以及类型构造函数。

或者只是将 的定义移动type AuthToken到与 . 的定义相同的文件中authTokenFromHeader


推荐阅读