Elm http 2.0.0函数不包括构造函数

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

对于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"
    , 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的答案)。