Haskell无法将函数定义为记录的一部分?

时间:2017-08-23 02:43:54

标签: haskell record

我想定义一个数据类型,它是一个名为f:

的函数的记录

data A = A { f :: Int -> Int }

我想创建一个实例:

A {f x = x * 2 }

但是:这会产生语法错误:

error: parse error on input ‘x’

1 个答案:

答案 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

参考