Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming 是否通过点函数更新Elm lang记录中的字段?_Functional Programming_Elm - Fatal编程技术网

Functional programming 是否通过点函数更新Elm lang记录中的字段?

Functional programming 是否通过点函数更新Elm lang记录中的字段?,functional-programming,elm,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 滚动您自己的更新功能 是的,虽然可能不如从野外得到的好。但想法是一样

是否可以通过函数(或其他方式)更新Elm记录中的字段,而不显式指定精确的字段名

例如:

> fields = { a = 1, b = 2, c = 3 }
> updateField fields newVal fieldToUpdate = { fields | fieldToUpdate <- newVal }
> updateField fields 5 .a -- does not work
滚动您自己的更新功能 是的,虽然可能不如从野外得到的好。但想法是一样的,您只需编写一个使用记录更新语法的函数:

setPhrase r v = { r | phrase <- v }
setPoints r v = { r | points <- v }
updInputFields r f = { r | inputFields <- f r.inputFields }
焦点
库 当您将
字段
字段集
组合在一起时,会得到类似于。尽管那个图书馆的用途不仅仅是记录。下面是一个使用
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})

理想情况下,您可以定义一个函数,该函数可以选择更新哪个字段,但您不能

请参阅,这解释了为什么目前无法在elm中从功能上更新记录中的字段:

“经验丰富的函数式程序员肯定会注意到,其中许多概念听起来很像透镜,而Elm实际上已经有一个由Evan自己编写的透镜式库,名为Focus。然而,这实际上并不能解决问题:它需要手动描述setter,就像纯基于函数的方法一样。”

…以下是Elm的创建者提供的信息,解释了为什么没有添加最近对记录所做的更改:

“我考虑过并决定反对。我知道那个建议。这是一个语言功能建议,而不是一个简单的语法问题”

setPhrase r v = { r | phrase <- v }
setPoints r v = { r | points <- v }
updInputFields r f = { r | inputFields <- f r.inputFields }
UpdatePhraseInput contents -> updInputFields model (flip setPhrase contents)
UpdatePointsInput contents -> updInputFields model (flip setPoints contents)
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})
UpdatePhraseInput contents -> Focus.set (inputFields => phrase) contents model
UpdatePointsInput contents -> Focus.set (inputFields => points) contents model