Sml 如何在标准ML中表示多态列表幺半群

Sml 如何在标准ML中表示多态列表幺半群,sml,ml,monoids,Sml,Ml,Monoids,我最近在标准ML中玩幺半群。签名很容易写: signature MONOID = sig type monoid val neutral : monoid val combine : monoid -> monoid -> monoid end 简单幺半群也是如此,例如整数加法幺半群: structure IntSumMonoid : MONOID = struct type monoid = int val neutral = 0 fun combine

我最近在标准ML中玩幺半群。签名很容易写:

signature MONOID =
sig
  type monoid
  val neutral : monoid
  val combine : monoid -> monoid -> monoid
end
简单幺半群也是如此,例如整数加法幺半群:

structure IntSumMonoid : MONOID =
struct
  type monoid = int
  val neutral = 0
  fun combine a b = a + b
end
但是我在定义一个更高级类型的幺半群时遇到了困难,比如
list
。当然,这不会编译:

structure ListMonoid : MONOID =
struct
  type monoid = 'a list
  val neutral = []
  fun combine a b = a @ b
end
经过一些搜索,我找到了以下基于函子的解决方案:

functor ListMonoid (type m) : MONOID =
struct
  type monoid = m list
  val neutral = []
  fun combine a b = a @ b
end

我的问题是,是否存在声明泛型列表幺半群的替代方案,理想情况下不需要
函子
声明。当试图声明列表幺半群时,显然没有必要知道列表包含的类型。

您可以在签名中参数化该类型。但是组成幺半群就变得奇怪或不可能了。Haskell使用类型类解决了这个问题,您可以使用functor在SML中模拟类型类,但是语法很重(正如您所注意到的)


描述翻译的论文是

是的,我基本上是为了学习目的将一些Haskell类型的类移植到SML。你能举一个例子说明作文变得奇怪或不可能吗?我在第一篇描述翻译的文章中添加了一个链接。
signature MONOID =
sig
  type 'a monoid
  val neutral : 'a monoid
  val combine : 'a monoid -> 'a monoid -> 'a monoid
end

structure IntSumMonoid : MONOID =
struct
  type 'a monoid = int
  val neutral = 0
  fun combine a b = a + b
end

structure ListMonoid : MONOID =
struct
  type 'a monoid = 'a list
  val neutral = []
  fun combine a b = a @ b
end