Go语言中定义Monoid(幺半群)接口的可行方案有哪些?
你给出的伪代码不符合Go语言的接口定义规则:Go的接口仅能声明方法签名,不能直接定义函数字段,同时幺半群的二元运算需要两个同类型元素作为输入,你原伪代码的op方法缺少一个输入参数。下面给出两种可行的实现方案:
方案1:无泛型实现(兼容Go1.18之前版本)
接口定义
type Monoid interface { // 二元运算,接收者为第一个运算元素,参数为第二个运算元素 Op(other Monoid) Monoid // 返回当前幺半群的单位元 Ide() Monoid }
求和幺半群实现
type MonoidSum struct { Val int } func (m MonoidSum) Op(other Monoid) Monoid { o := other.(MonoidSum) return MonoidSum{Val: m.Val + o.Val} } func (m MonoidSum) Ide() Monoid { return MonoidSum{Val: 0} }
最大值幺半群实现
import "math" type MonoidMax struct { Val int } func max(a, b int) int { if a > b { return a } return b } func (m MonoidMax) Op(other Monoid) Monoid { o := other.(MonoidMax) return MonoidMax{Val: max(m.Val, o.Val)} } func (m MonoidMax) Ide() Monoid { return MonoidMax{Val: math.MinInt} }
该方案的缺点是需要手动做类型断言,只有运行时才能校验输入类型是否匹配,传入不同类型的Monoid实例会触发panic。
方案2:泛型实现(Go1.18及以上版本推荐)
通过泛型可以实现编译期类型校验,无需运行时类型断言,安全性和性能更好。
接口定义
type Monoid[T any] interface { Op(other T) T Ide() T }
求和幺半群实现
type MonoidSum int func (m MonoidSum) Op(other MonoidSum) MonoidSum { return m + other } func (m MonoidSum) Ide() MonoidSum { return 0 }
最大值幺半群实现
import "math" type MonoidMax int func (m MonoidMax) Op(other MonoidMax) MonoidMax { if m > other { return m } return other } func (m MonoidMax) Ide() MonoidMax { return MonoidMax(math.MinInt) }
内容的提问来源于stack exchange,提问作者sgsw
相关产品推荐
相关产品推荐

