如何对函数体使用集合推导
How to use a set comprehension for the body of a function
假设我有以下签名:
sig A {}
sig B {}
sig P {
a: A,
b: B
}
我如何编写一个函数 f
,例如 f
returns P
的集合,每个成员的值都为 x: A
的 a
字段?
在计算器中输入表达式 {p: P | p.a = x}
返回一个集合,但是当我尝试以这种方式定义 f
时
fun f(a: A) : set P {
{ p: P | p.a = a }
}
alloy 告诉我我犯了一个错误:
A type error has occurred
This cannot be a legal relational join where
left hand side is p (type = {this/P})
right hand side is a (type = {this/A})
问题是您用函数参数隐藏了 a
关系。如果将 f(a: A)
替换为 f(a': A)
,它会起作用。或者,您可以使用 @
运算符,它 returns 全局值而不是集合的局部值:
fun f(a: A) : set P {
{ p: P | p.@a = a }
}
假设我有以下签名:
sig A {}
sig B {}
sig P {
a: A,
b: B
}
我如何编写一个函数 f
,例如 f
returns P
的集合,每个成员的值都为 x: A
的 a
字段?
在计算器中输入表达式 {p: P | p.a = x}
返回一个集合,但是当我尝试以这种方式定义 f
时
fun f(a: A) : set P {
{ p: P | p.a = a }
}
alloy 告诉我我犯了一个错误:
A type error has occurred This cannot be a legal relational join where left hand side is p (type = {this/P}) right hand side is a (type = {this/A})
问题是您用函数参数隐藏了 a
关系。如果将 f(a: A)
替换为 f(a': A)
,它会起作用。或者,您可以使用 @
运算符,它 returns 全局值而不是集合的局部值:
fun f(a: A) : set P {
{ p: P | p.@a = a }
}