我想定义像“Monoid”这样的结构。(这是一个出现在Group-Theory中的单词。
这里有一个Monoid-Structure的例子。
实施例⑴:
type monoid_sum struct{
val int
}
func op(x,y monoid_sum) monoid_sum {
return monoid_sum{x.val + y.val}
}
func ide() monoid_sum{
return monoid_sum{0}
}
实施例(2):
import "math"
func max(a,b int) int{
if a > b{
return a
}else{
return b
}
}
type monoid_max struct {
val int
}
func op(x,y monoid_max) monoid_max {
return monoid_max{max(x.val,y.val)}
}
func ide() monoid_max {
return monoid_max{math.MinInt}
}
有没有什么好的方法来定义一个monoid接口?我想做一个这样的界面:
type monoid interface{
op func(monoid) monoid // mapping_function(monoid,monoid) -> monoid(binary operations in monoid)
ide() monoid // identity_function() -> monoid (return Identity element)
}
尽管代码不起作用(只是伪代码)
3条答案
按热度按时间llmtgqce1#
您可以将
Monoid
接口定义为以下通用接口:Combine()
对应于幺半群的(关联的)二元运算,Identity()
返回幺半群的单位元素。您分别将它们称为op()
和ide()
。CombineMonoids
是一个通用的便利函数,用于将任意数量的monoid组合成单个monoid:类型参数
M
上的约束Monoid[M]
-即M Monoid[M]
-意味着它适用于任何具有Identity() M
和Combine(M) M
方法的类型M
,即它满足Monoid[M]
。示例
例如,下面是
SumMonoid
和MaxMonoid
类型,它们分别对应于monoid_sum
和monoid_max
。SumMonoid
类型
SumMonoid
满足接口Monoid[SumMonoid]
。MaxMonoid
类型
MaxMonoid
满足接口Monoid[MaxMonoid]
。非通用
Monoid
接口怎么样?与您的建议类似,原则上您可以将
Monoid
定义为非泛型接口:问题是特定幺半群的原始类型(例如
SumMonoid
或MaxMonoid
)将被擦除到接口Monoid
。将
SumMonoid
和MaxMonoid
组合在一起是没有意义的--你会将类型Assert放在Combine
方法实现中,如果要组合的两个monoid的 *dynamic类型 * 不同,这将导致恐慌。因此,基于通用接口的解决方案似乎更健壮。k97glaaz2#
您必须遵循接口定义,因为它们是为struct定义的,以便实现接口。当接口为
op
方法定义返回类型为monoid
时,在实现该接口时必须返回monoid。看看以下是否有帮助:wyyhbhjk3#
谢谢大家的帮助和好意!
我成功地定义了幺半群结构。