通过点功能更新Elm-lang记录中的字段?

sea*_*lor 8 functional-programming elm

是否可以通过函数(或其他方式)更新Elm记录中的字段而无需明确指定精确的字段名称?

例:

> fields = { a = 1, b = 2, c = 3 }
> updateField fields newVal fieldToUpdate = { fields | fieldToUpdate <- newVal }
> updateField fields 5 .a -- does not work
Run Code Online (Sandbox Code Playgroud)

更新:

要添加一些上下文,我试图干掉以下代码:

UpdatePhraseInput contents ->
  let currentInputFields = model.inputFields
  in { model | inputFields <- { currentInputFields | phrase <- contents }}

UpdatePointsInput contents ->
  let currentInputFields = model.inputFields
  in { model | inputFields <- { currentInputFields | points <- contents }}
Run Code Online (Sandbox Code Playgroud)

如果我能updateInput像这样调用一个神话般的函数,那将是非常好的:

UpdatePhraseInput contents -> updateInput model contents .phrase
UpdatePointsInput contents -> updateInput model contents .points
Run Code Online (Sandbox Code Playgroud)

Apa*_*hka 7

滚动你自己的更新功能

是的,虽然可能不如从田地里得到的好.但是这个想法是一样的,你编写一个只使用记录更新语法的函数:

setPhrase r v = { r | phrase <- v }
setPoints r v = { r | points <- v }
updInputFields r f = { r | inputFields <- f r.inputFields }
Run Code Online (Sandbox Code Playgroud)

然后你可以写:

UpdatePhraseInput contents -> updInputFields model (flip setPhrase contents)
UpdatePointsInput contents -> updInputFields model (flip setPoints contents)
Run Code Online (Sandbox Code Playgroud)

Focus

当你把fieldfieldSet,你得到的东西像Focus.虽然该库可以用于更多的事情,而不仅仅是记录.以下是使用以下内容的示例Focus:

phrase = Focus.create .phrase (\upd r -> { r | phrase <- upd r.phrase })
points = Focus.create .points (\upd r -> { r | points <- upd r.points })
inputFields = Focus.create .inputFields (\upd r -> { r | inputFields <- upd r.inputFields})
Run Code Online (Sandbox Code Playgroud)

然后你可以写:

UpdatePhraseInput contents -> Focus.set (inputFields => phrase) contents model
UpdatePointsInput contents -> Focus.set (inputFields => points) contents model
Run Code Online (Sandbox Code Playgroud)