我很新,目前正在努力学习榆树.我来自JS/React并且之前没有任何RFP经验.
我现在在指南中:http: //guide.elm-lang.org/architecture/user_input/text_fields.html
我有问题的部分是update和view:
-- 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定义之后.但是在这里我们有一个函数的结果->.
我希望我的问题有意义,我对这种(可能是很棒的)语言非常困惑.
当您声明使用一个接受String的Constructor type Msg = Change String声明单个type(Msg)时.
请参阅关于联合类型的榆树指南部分(AKA代数数据类型,ADT).
这是一个示例:
Run Code Online (Sandbox Code Playgroud)type User = Anonymous | Named String所以创建类型
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,它也包含在榆木指南中
| 归档时间: |
|
| 查看次数: |
332 次 |
| 最近记录: |