记录中紧凑函数定义的语法扩展

时间:2019-01-19 03:10:50

标签: haskell

以下语法是定义作用于模块或在where子句中的函数的常用方法。

add :: Int -> Int -> Int
add x y = x + y

但是,它在记录内部不起作用。至少在默认情况下,这在语法上是无效的

data RecordWithFunc = RecordWithFunc { func :: Int -> Int -> Int}

a :: RecordWithFunc
a = RecordWithFunc {
    func x y = x + y
}

这是GHC前端产生解析错误的示例

$ runhaskell /tmp/hask.hs 

/tmp/hask.hs:5:10: error: parse error on input ‘x’
  |
5 |     func x y = x + y
  |          ^

是否有语法扩展名可以使参数出现在字段名称之后?

1 个答案:

答案 0 :(得分:8)

不,没有这样的扩展名。 (虽然会很好!)执行此操作的常用方法是:

a :: RecordWithFunc
a = RecordWithFunc {
    func = \x y -> x + y
}

甚至在这种情况下:

a :: RecordWithFunc
a = RecordWithFunc {
    func = (+)
}