【发布时间】:2016-05-08 15:33:53
【问题描述】:
在 elm 中,是否可能类似于以下内容
foo : Int -> Html
foo inputNum =
addToNumHistory inputNum ;
display inputNum
上面的目的是执行多行代码?
如果不是,是不是因为上面是副作用的例子?
如果无法实现上述语法,如何同时执行两个函数/两行代码,如上所述,或者作为给定输入(案例分支)的结果?
编辑
以上是一个不好的例子。以下使用 Elm 架构:
--Model
type alias Model =
{ number : Int
, numberHistory : List Int
}
type Action
= Number Int
--Update
update : Action -> Model
update action =
case action of
Number num->
addToNumHistory num
addToNumHistory : Int -> Model -> Model
addToNumHistory num modelHistory =
{ model
| number = num
, numberHistory = num :: model.numberHistory
}
--View
view : Signal.Address Action -> Model -> Html
view action model =
div []
[ field
"text"
address
Number model.number
"Enter lucky number here pal!"
model.number
]
鉴于此,我是否正确假设以更改基础模型的方式“执行多行”,只需使用/扩展模型 - 例如,实现类似于以下的更改:
--Update
update : Action -> Model
update action =
case action of
Number num->
addToNumHistory num;
addToChangeHistory
只需将模型扩展如下:
--Model
type alias Model =
{ number : Int
, numberHistory : List Int
, changeHistory : List Date
}
--Update
update : Action -> Model
update action =
case action of
Number num->
addToNumHistoryWithChangeHistory num
addToNumHistoryWithChangeHistory : Int -> Model -> Model
addToNumHistory num modelHistory =
{ model
| number = num
, numberHistory = num :: model.numberHistory
, changeHistory = getCurrentDate :: model.changeHistory
}
getCurrentDate : Date
【问题讨论】:
-
如果您关注The Elm Architecture,则所有状态更改或副作用都应该发生在
update函数中。如果您实现了不同的东西,那么我们希望看到更多详细信息。 -
@halfzebra 感谢上述 - 可以在
updatecase 语句中执行多个语句吗? -
简而言之,不,但是您可以通过稍微不同的方式实现所需的行为。您是否尝试过在
update中使用Let Expressions?您对 Elm 架构的熟悉程度如何? -
@halfzebra 我在
update语句中经常使用let表达式进行解构,但这如何实现多语句执行? -
这取决于
addToNumHistory到底应该做什么,例如,您可以在update内部let表达式内部使用不同的操作再次运行update。这会有帮助吗?
标签: functional-programming elm side-effects