说我有这个记录:
type alias Rec = { a : Int }
例如,一个函数接受其中两个并求和它们的整数。
f: Rec -> Rec -> Int
这可以使用记录访问器(即f x y = x.a + y.a
)来实现,但有没有办法使用模式匹配来提取两个整数?
显然,这两个不起作用,因为它们会将两个不同的数字绑定到同一个变量:
f {a} {a} = a + a
f x y = case (x, y) of ({a}, {a}) -> a + a
答案 0 :(得分:4)
目前的榆树语似乎没有这种方式。在ML和Haskell等其他函数式语言中,您可以在记录中编写模式,如:
$ sml
Standard ML of New Jersey v110.74 [built: Sat Oct 6 00:59:36 2012]
- fun func {field=x} {field=y} = x+y ;
val func = fn : {field:int} -> {field:int} -> int
- func {field=123} {field=45} ;
val it = 168 : int
您也可以向Elm的开发者提出功能请求 - 或者至少在community mailing list中提问。
P.S。在快速搜索之后,我发现这样的proposal在Elm的记录字段上添加了类似ML的模式匹配,但似乎已经被拒绝了。: - (
答案 1 :(得分:3)
目前无法做到这一点。有模式别名(as
)但它只适用于整个模式,所以这是无效的:
type alias Rec = { a : Int }
f: Rec -> Rec -> Int
f { a as xa } { a as ya } = xa + ya
main = f { a = 1 } { a = 2 }
结果:
Detected errors in 1 module.
-- SYNTAX PROBLEM --------------------------------------------------------------
I ran into something unexpected when parsing your code!
4| f { a as xa } { a as ya } = xa + ya
^
I am looking for one of the following things:
a closing bracket '}'
whitespace