Elm 榆树型混淆

Elm 榆树型混淆,elm,Elm,我在Elm开始了我的第一个简单的web应用程序。我的大部分代码目前都是从中改编的。我正在使用一个API,该API将在响应头中为我提供一个authToken。我有一个AuthToken类型,应该表示该令牌。从标头中取出值并将其转换为错误String或AuthToken的结果会导致问题。我希望我可以说我正在返回一个AuthToken,返回一个字符串,这会很好,因为我的AuthToken现在只是字符串。很明显,我对榆树的类型有些不了解 以下是AuthToken的定义: type AuthToken

我在Elm开始了我的第一个简单的web应用程序。我的大部分代码目前都是从中改编的。我正在使用一个API,该API将在响应头中为我提供一个authToken。我有一个AuthToken类型,应该表示该令牌。从标头中取出值并将其转换为错误
String
AuthToken
的结果会导致问题。我希望我可以说我正在返回一个AuthToken,返回一个字符串,这会很好,因为我的AuthToken现在只是字符串。很明显,我对榆树的类型有些不了解

以下是
AuthToken
的定义:

type AuthToken
  = AuthToken String
我的方法太复杂了,现在只是尝试做一些类型更改(稍后我还想在这里对身体做一些工作):

我希望happy case会返回一个Ok结果,将响应头中的字符串转换为
AuthToken
作为其值。相反,我得到的是
找不到变量“AuthToken”
。从文档中,我希望得到一个与类型同名的构造函数。如果我只是使用
Ok头
,编译器会不高兴,因为我返回的是
结果字符串
,而不是承诺的
结果字符串AuthToken


这里的正确方法是什么?

代码看起来很好。错误消息表示已在其他模块中定义了
类型AuthToken
,但未完全导入到定义
authTokenFromHeader
的模块中。您可以在Elm指南中阅读Elm的模块系统:

假设模块
类型
中定义了
类型AuthToken
,模块
网络
中定义了
authTokenFromHeader
,则可能的修复方法是:

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

的定义移动到同一个文件中,以确保
AuthToken
可见,您是在同一个文件中有
type AuthToken
定义,还是从某个导入的模块中将其公开?@IgorDrozdov是正确的,您应该在定义AuthToken
module X.AuthToken exposing(AuthToken(..)
的模块中以及导入模块的模块中公开类型构造函数
import X.AuthToken exposing(AuthToken(..)
。旁注:同样令人困惑的是(虽然没有错误)您定义了两次
标题
(一次作为let绑定的结果,一次作为case模式中的字符串),谢谢!我正在导入并公开它们,但缺少
(..)
。每次我看到这些,我都认为它们表明这个例子是缩写的,直到我注意到你,@dvekeman和医生们一直在使用这些。很好!我稍微更新了答案,以解释
(…)
的重要性。
module Net exposing (authTokenFromHeader)

import Types exposing (AuthToken(..))

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