Elm-将重复的代码提取到单个函数中以进行事件处理

问题描述 投票:2回答:1

这里我有几个函数,都只在模型记录上设置了一个字段。用一种更具动态性的语言,我只有一个设置函数,然后将字段名称(作为字符串)和要在模型对象上设置的值传递给它。

是否可以在Elm中传递字段名称?榆树做这种事情的方式是什么?

type alias Patient =
  { id : String
  , name : String
  , dateOfBirth : String
  , sex : String
  ...
  }

setPatientName : Patient -> String -> Patient
setPatientName patient value =
    { patient | name = value }

setPatientDateOfBirth : Patient -> String -> Patient
setPatientDateOfBirth patient value =
  { patient | dateOfBirth = value }

setPatientSex : Patient -> String -> Patient
setPatientSex patient value =
  { patient | sex = value }

... many others

我当前正在将这些功能中的每一个用作输入元素的事件处理程序。因此,我需要一个可用于处理输入事件的函数。理想情况下,我只定义一个函数,并对所有输入元素使用该函数,然后将要更新的字段传递给患者记录。

record elm setter
1个回答
2
投票

简短的答案是“否”。但这似乎有点像an XY problem。尚不清楚您要实现什么好处,因为该功能的完整应用将比等效的记录更新表达式更长:

setField "name" patient value

-- vs

{ patient | name = value }

并且作为部分应用的函数仅比具有缩短的参数名称的等效匿名函数稍短:

setField "name"

-- vs

\r x -> { r | name = x }

尽管后者is与所有符号相比明显更嘈杂。

还有一个获取记录字段的简写功能:

.name

-- vs

\r -> r.name

因此,对于setter函数也具有专用语法也有一些先例,但不幸的是没有。可能是因为这样做会使语言(尤其是语法)复杂化,而带来的收益却相对较少。因此,我对您正在[[实际上想要完成的事情感到好奇。

© www.soinside.com 2019 - 2024. All rights reserved.