具有相同字段的两个记录上的模式匹配

时间:2016-06-29 12:00:59

标签: functional-programming record elm

说我有这个记录:

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

2 个答案:

答案 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