我从Elm的第一个简单的Web应用程序开始。目前,我的大部分代码都来自https://github.com/rtfeldman/elm-spa-example。我正在使用一个API,该API将在响应标头中提供authToken。我有一个AuthToken类型,应该代表该令牌。从标题中取出值并将其转换为错误String
或AuthToken
的结果会造成麻烦。我以为我可以说我要返回一个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
。
这里正确的方法是什么?
答案 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
的定义相同的文件中。