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

5

假设我有这样一条记录:

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个回答

4

在当前的 Elm 语言中似乎没有这样的方法。 在其他函数式语言如 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的开发者提出功能请求,或至少在社区邮件列表中询问问题。
顺便提一句,在快速搜索后,我找到了这样一个建议,它在Elm中添加了类似ML的模式匹配来匹配记录字段,但似乎已被拒绝了。 :-(

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接