elm - 榆树类型混淆
问题描述
我在 Elm 中开始了我的第一个简单的 Web 应用程序。我的大部分代码目前改编自https://github.com/rtfeldman/elm-spa-example。我正在使用一个 API,它将在响应标头中给我一个 authToken。我有一个应该代表该令牌的 AuthToken 类型。从标头中取出值并将其转换为错误String
或AuthToken
导致麻烦的结果。我希望我可以说我正在返回一个 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
。
这里的正确方法是什么?
解决方案
代码看起来很好。错误消息表明type AuthToken
已在不同的模块中定义,并且未完全导入到定义authTokenFromHeader
. 您可以在 Elm 指南: Modules中阅读有关 Elm 的模块系统的信息。
假设type AuthToken
在 module中定义Types
并在 module 中定义,可能的修复是:authTokenFromHeader
Net
类型.榆树:
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
。