【问题标题】:How to represent a polymorphic list monoid in Standard ML如何在标准 ML 中表示多态列表幺半群
【发布时间】:2015-01-14 14:39:04
【问题描述】:

我最近在标准 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

我的问题是是否存在声明通用列表幺半群的替代方法,理想情况下不需要functor 声明。在尝试声明一个列表幺半群时,显然没有必要知道列表的包含类型。

【问题讨论】:

    标签: sml ml monoids


    【解决方案1】:

    您可以参数化签名中的类型。但是组成幺半群然后变得奇怪或不可能。 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
    

    描述翻译的论文是http://www.mpi-sws.org/~dreyer/papers/mtc/main-short.pdf

    【讨论】:

    • 是的,我基本上是将一些 Haskell 类型的类移植到 SML 以用于学习目的。你能举一个组合变得奇怪或不可能的例子吗?
    • 我在第一篇描述翻译的论文中添加了一个链接。
    猜你喜欢
    • 1970-01-01
    • 2015-04-05
    • 2021-11-21
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 2017-11-30
    • 1970-01-01
    相关资源
    最近更新 更多