以下语法是定义作用于模块或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
  |          ^

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

最佳答案

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

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

甚至在这种情况下:
a :: RecordWithFunc
a = RecordWithFunc {
    func = (+)
}

10-08 08:47