我想定义一个数据类型,它是一个名为f:
的函数的记录 data A = A { f :: Int -> Int }
我想创建一个实例:
A {f x = x * 2 }
但是:这会产生语法错误:
error: parse error on input ‘x’
答案 0 :(得分:0)
以下是使用字段标签的构造语法。
aexp → qcon { fbind1 , … , fbindn } (labeled construction, n ≥ 0)
fbind → qvar = exp
请注意,qcon
是构造函数语法,qvar
是变量语法,exp
是表达式语法。
因此A {f x = x * 2}
不起作用的原因是因为它是无效的语法。一个有效且可能是您想要的语法是A {f = \x -> x * 2}
。或者,A {f = (* 2)}
,A {f = (2 *)}
或A {f = (*) 2}
。
使用字段标签构建的操作类似于命名参数。给定数据类型定义,例如
data Person = Person { name :: String, age :: Int }
表达式
Person { age = 65, name = "Wilbur Suidae" }
平均值
Person "Wilbur Suidae" 65
也就是说,构造函数参数按照构造函数定义排序以匹配字段的顺序。
表达式
Person { age = 65 }
平均值
Person undefined 65
也就是说,如果没有为某个字段显式赋值,则会隐式赋值为undefined
。