榆树"类型"语法 - 值来自何处?

Moe*_*ler 10 syntax elm

我很新,目前正在努力学习榆树.我来自JS/React并且之前没有任何RFP经验.

我现在在指南中:http: //guide.elm-lang.org/architecture/user_input/text_fields.html

我有问题的部分是updateview:

-- UPDATE

type Msg
  = Change String

update : Msg -> Model -> Model
update msg model =
  case msg of
    Change newContent ->
      { model | content = newContent }


-- VIEW

view : Model -> Html Msg
view model =
  div []
    [ input [ placeholder "Text to reverse", onInput Change ] []
    , div [] [ text (String.reverse model.content) ]
    ]
Run Code Online (Sandbox Code Playgroud)

让我们从Msg声明开始.指南说:

它需要一个参数,在这种情况下是我们声明Msg类型时创建的Change函数:

更改:字符串 - >消息

我不知道这是怎么发生的:

type Msg
  = Change String
Run Code Online (Sandbox Code Playgroud)

我们是如何在这里定义更改功能的?我们如何定义该功能的工作原理?对我来说,看起来我们只是声明了Msg的类型,它以某种方式包含了什么Change和类型String.

我的第二个问题是关于更新:

update : Msg -> Model -> Model
update msg model =
  case msg of
    Change newContent ->
      { model | content = newContent }
Run Code Online (Sandbox Code Playgroud)

对我来说,这看起来像update是一个更高阶的函数,它接受一个Msg并返回一个函数Model -> Model.但是我们用两个参数定义一个函数.难道Msg -> Model -> Model只是意味着所有,但最后一部分是参数?

然后我们调用Change函数:

Change newContent ->
          { model | content = newContent }
Run Code Online (Sandbox Code Playgroud)

我没有得到的是箭头.通常箭头是在param定义之后.但是在这里我们有一个函数的结果->.

我希望我的问题有意义,我对这种(可能是很棒的)语言非常困惑.

Dae*_*yth 6

当您声明使用一个接受String的Constructor type Msg = Change String声明单个type(Msg)时.

请参阅关于联合类型的榆树指南部分(AKA代数数据类型,ADT).

这是一个示例:

type User = Anonymous | Named String
Run Code Online (Sandbox Code Playgroud)

所以创建类型User也创建了名为Anonymous和的构造函数Named.如果要创建一个User,则必须使用这两个构造函数中的一个

构造函数是函数,所以你称之为Change "a string"(返回类型Msg)

构造函数还提供了使用模式匹配来提取联合类型中的内部值的功能.这是->你不熟悉的用法.

case msg of
  Change theString -> ... use theString ...
Run Code Online (Sandbox Code Playgroud)

你的第二个问题;

对我来说,这看起来像update是一个更高阶的函数,它接受一个Msg并返回一个函数Model - > Model

是的,这或多或少发生了什么.函数应用程序的优先规则意味着您可以不带括号调用它们.这称为currying,它也包含在榆木指南中