Elm http 2.0.0函数不包括构造函数
对于http请求函数,两者都建议将构造函数(例如Elm http 2.0.0函数不包括构造函数,http,elm,Http,Elm,对于http请求函数,两者都建议将构造函数(例如GotText)传递给expect函数(例如expectString),用于expect字段,例如: type Msg = GotText (Result Http.Error String) getPublicOpinion : Cmd Msg getPublicOpinion = Http.get { url = "https://elm-lang.org/assets/public-opinion.txt" , ex
GotText
)传递给expect函数(例如expectString
),用于expect
字段,例如:
type Msg
= GotText (Result Http.Error String)
getPublicOpinion : Cmd Msg
getPublicOpinion =
Http.get
{ url = "https://elm-lang.org/assets/public-opinion.txt"
, expect = Http.expectString GotText
}
我理解这一点,但在我看来,限制API需要构造函数(例如,GotText
)过于严格
例如,可以使用
identity
从请求函数get
提取构造函数函数GotText
:
getPublicOpinion = Cmd.map GotText (
Http.get
{ url = "https://elm-lang.org/assets/public-opinion.txt"
, expect = Http.expectString identity
})
但这就引出了一个问题:为什么http API需要构造函数* *或者至少允许我们省略
expect
字段并返回Result Http.Error String
这不是限制,实际上是方便
如果Http.expectString
没有接受函数(Result Http.Error String->msg)
,那么Http.get
将返回Cmd(Result Http.Error String)
,这是在传入标识时所做的
由于所有Cmd
s的结果总是需要一个Msg
,运行时可以传递给update
函数,因此您必须始终Cmd.map
每个调用的结果Http.get
才能将Cmd(结果Http.Error字符串)
转换为Cmd Msg
为了避免每次调用Http.get
时都必须调用Cmd.map
,API允许您将函数直接传递到Http.expectString
。这减少了输入,减少了嵌套,因此对读者来说更清晰
您将看到此约定在许多模块中重复。例如:
Json.Encode.list
的类型为list:(a->Value)->list a->Value
它需要一个函数来对列表中的元素进行Json编码,这样就不必首先使用list.map
对列表中的元素进行Json编码
Html.Events.onInput
具有类型onInput:(String->msg)->属性msg
它需要一个函数将String
转换为msg
值,这使您不必使用Html.Attribute.map
输入onInput
的结果将属性字符串
转换为属性msg
。如果必须为每个事件处理程序调用Html.Attribute.map
,并对任何Html元素调用Attribute
,这将是一个非常痛苦的过程
http调用的结果对您的程序产生影响的唯一方法是通过update函数发送结果,您可以使用构造函数并在更新中处理该结果。它不是约束,而是指导你。如果你没有提供构造函数,返回类型将是Cmd(Result Http.Error String->msg)
,这很奇怪。核心Elm库强调采用消息构造函数而不是返回包含函数的命令。好吧,我开始认为正确答案是“因为约定”。具体来说:“因为Elm架构约定”(即Ben的答案)和“因为没有命令返回函数”(即Sidney的答案)。