询问支持记录内字段名后带参数的Haskell语法扩展
解答
好问题!目前GHC并没有直接支持在记录构造器的字段赋值中使用字段名 参数列表 = 表达式这种语法的扩展——你遇到的解析错误,本质是因为记录构造器的花括号内,GHC只接受字段名 = 表达式的键值对格式,而func x y = x + y属于函数声明范畴,并非合法表达式,所以默认会报错。
不过我们有几个简洁的替代方案,能让你写出同样清晰的代码:
使用Lambda表达式(无需任何扩展)
这是最直接的替代方式,把函数逻辑写成匿名lambda绑定给字段:data RecordWithFunc = RecordWithFunc { func :: Int -> Int -> Int} a :: RecordWithFunc a = RecordWithFunc { func = \x y -> x + y }用where子句分离函数定义
如果函数逻辑比较复杂,把函数定义抽离到where子句中,再赋值给字段,可读性会更好:data RecordWithFunc = RecordWithFunc { func :: Int -> Int -> Int} a :: RecordWithFunc a = RecordWithFunc { func = add } where add x y = x + y运算符部分应用(适合简单逻辑)
像你的例子里的加法操作,甚至可以直接用运算符的部分应用来简化:data RecordWithFunc = RecordWithFunc { func :: Int -> Int -> Int} a :: RecordWithFunc a = RecordWithFunc { func = (+) }
这些方案都能实现你想要的效果,同时符合Haskell的标准语法规范。
内容的提问来源于stack exchange,提问作者Greg Nisbet
相关产品推荐
相关产品推荐

