考虑一下
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 = ...如何推广updateRec和updateRec2.变成一个函数?
发布于 2016-05-07 12:30:33
这里有一种更好的方法来做同样的事情:
updateA : Int -> Rec -> Rec
updateA x rec = { rec | a = x }
-- Similarly for b, c现在您可以执行以下操作,假设您已经有了要更新的值rec : Rec:
myUpdatedRec : Rec
myUpdatedRec =
rec
|> updateA 7
|> updateB 19现在可以通过将|> updateX ...串在一起来更新任意数量的字段。
发布于 2016-05-05 06:06:51
您希望编写一个具有不同类型参数的变量数的函数。这在动态类型化语言(Javascript,Python,Ruby)中很常见,但在类型化语言中通常是不允许的。埃尔姆不允许。
您可以使用Maybe类型模拟不同类型参数的变量数,将Nothing理解为“缺失参数”:
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:
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。
发布于 2016-05-05 12:36:44
Elm的记录更新语法似乎正是您所要寻找的。您“传入”您想要更新的记录,下面是r,您可以返回一个记录,其中包含您想要更改的任何字段,而不必指定每个字段:
ex1 = { r|a = 1 }
ex2 = { r|b = 2, c = 3 }您不需要创建一组额外的函数,只用于在特定时间更新某些字段,因为Elm的记录更新语法就是广义函数。
https://stackoverflow.com/questions/37042757
复制相似问题