首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编写更新记录字段的泛型函数

如何编写更新记录字段的泛型函数
EN

Stack Overflow用户
提问于 2016-05-05 05:03:58
回答 3查看 165关注 0票数 1

考虑一下

代码语言:javascript
复制
type alias Rec = { a: Int, b: Int, c:Int }
updateRec r aVal            = { r|a = aVal } 
updateRec2 r aVal bVal      = { r|a = aVal, b= bVal } 
updateRec3 r aVal bVal cVal = ...

如何推广updateRecupdateRec2.变成一个函数?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-07 12:30:33

这里有一种更好的方法来做同样的事情:

代码语言:javascript
复制
updateA : Int -> Rec -> Rec
updateA x rec = { rec | a = x }

-- Similarly for b, c

现在您可以执行以下操作,假设您已经有了要更新的值rec : Rec

代码语言:javascript
复制
myUpdatedRec : Rec
myUpdatedRec =
  rec 
  |> updateA 7
  |> updateB 19

现在可以通过将|> updateX ...串在一起来更新任意数量的字段。

票数 2
EN

Stack Overflow用户

发布于 2016-05-05 06:06:51

您希望编写一个具有不同类型参数的变量数的函数。这在动态类型化语言(Javascript,Python,Ruby)中很常见,但在类型化语言中通常是不允许的。埃尔姆不允许。

您可以使用Maybe类型模拟不同类型参数的变量数,将Nothing理解为“缺失参数”:

代码语言:javascript
复制
updateRec : Rec -> Maybe Int -> Maybe Int -> Maybe Int -> Rec
updateRec r a b c = 
  { r
  | a = a |> Maybe.withDefault r.a
  , b = b |> Maybe.withDefault r.b
  , c = c |> Maybe.withDefault r.c
  } 

如果记录字段都是相同类型的(此处为Int),则可以接受List Int

代码语言:javascript
复制
updateRec : Rec -> List Int -> Rec 
updateRec r fields = 
  case fields of 
    [a] -> { r | a = a }
    [a,b] -> { r | a = a, b = b }
    [a,b,c] -> { r | a = a, b = b, c = c }
    _ -> r

我不喜欢这个解决方案,因为如果您不小心提供了包含0或4+元素的列表,它就会悄悄地失败。如果这个函数对您有帮助,那么也许最好首先使用List Int而不是Rec

票数 2
EN

Stack Overflow用户

发布于 2016-05-05 12:36:44

Elm的记录更新语法似乎正是您所要寻找的。您“传入”您想要更新的记录,下面是r,您可以返回一个记录,其中包含您想要更改的任何字段,而不必指定每个字段:

代码语言:javascript
复制
ex1 = { r|a = 1 }
ex2 = { r|b = 2, c = 3 }

您不需要创建一组额外的函数,只用于在特定时间更新某些字段,因为Elm的记录更新语法就是广义函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37042757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档