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