【问题标题】:ML: Is it possible to create a list of structures in SML?ML:是否可以在 SML 中创建结构列表?
【发布时间】:2017-08-04 05:06:00
【问题描述】:

我是 ML/Haskell 的初学者,我正在尝试创建一个结构列表。 实际上,我正在使用Urweb(功能性网络编程语言,ML 和 Haskell 的许多功能)开发一个 Web 应用程序。我正在尝试创建一个到 Tinymce(开源富文本编辑器,它包括所有插件,如打印,链接)。因此,为了管理所有插件,我以结构的形式编写,我需要一个数据结构来保存所有结构(在我的例子中是插件),并且在最后阶段可以用来初始化我的编辑器。

例如:

val plugins = [print, link, img];

列表中的元素pluginsprint是一个结构体:

structure print = struct
  type t = string
  .
  .
end

我怎样才能做到这一点?

【问题讨论】:

  • 在 SML 中根本不能将结构放入列表中;它们是模块语言的一部分,而不是包含可操作值的核心语言。也就是说,我要重申,在我们提供帮助之前,我们需要知道您的最终目标是什么。
  • @jeevjyot 听起来您可能更想要仿函数,例如查看链接中包含的小“插件”,因为仿函数的结果共享相同的类型,它们可以 i> 被包含在一个列表中。 catonmat.net/blog/on-functors
  • 哦,对,这听起来像是个主意。所以所有函数都会返回结构,这就是它们共享相同类型的方式,对吧?如果我错了,请纠正我。感谢您的链接。 @马特
  • @jeevjyotsinghchhabda 对,共享相同的输入/输出类型,但函数仍然可以在其各自的结构上具有“闭包”。
  • @matt 对,有道理。非常感谢,我会努力实现的。再次感谢

标签: list structure sml ml


【解决方案1】:

一般的答案是不,你不能创建一个列表 结构,签名和函子也是如此

然而;如果您的插件系统的构建方式是每个插件的入口类型和出口类型在所有插件中都是相同的,那么您可以为结构构建一种闭包并将其嵌入到函数中。

然后您可以使用函子来构建插件系统的功能

我们从每个“插件”的界面开始。

signature DANCER =
sig
    type t;

    val dancer : t
    val tired : t -> bool
    val dance : t -> t;
end

接着是我们的应用程序与插件交互的接口。

datatype exhaustion = Exhausted;

signature DANCING_MANIA =
sig
  val dance : unit -> exhaustion;
end

上述DANCING_MANIA签名的实现, 接受 DANCER,并隐藏插件/结构之间的差异

functor Dancer (D : DANCER) : DANCING_MANIA =
struct

  fun dance() =
    let fun until_exhaustion (dancer) =
         if not (D.tired dancer)
            then until_exhaustion(D.dance(dancer))
            else Exhausted;
     in until_exhaustion(D.dancer) end
end

最后我们可以实现一些插件,并将它们放在一个列表中。

structure Tony :> DANCER =
struct
  type t = int;

  val dancer = 5;

  fun tired x = x <= 0;
  fun dance x = (print "tony dance!\n"; x - 1);
end

structure Annette :> DANCER =
struct
  type t = real;

  val dancer = 1.0;

  fun tired x = x <= 0.0;
  fun dance x = (print "annette dance!\n"; x - 0.2);
end
structure TonyDance = Dancer(Tony);
structure AnnetteDance = Dancer(Annette);

val dancers = [TonyDance.dance, AnnetteDance.dance];

fun danceOff (x::xs) = let val _ = x(); in danceOff(xs) end
  | danceOff ([]) = ();
val _ = danceOff(dancers);

因此,我们的想法是,虽然您无法创建结构列表,但 您可以创建一个事物列表,每个事物都包含不同的结构, 只要暴露的类型是统一的。

【讨论】:

  • 感谢@matt 的详细解释。项目完成后我会分享。
猜你喜欢
  • 2018-07-23
  • 2014-03-30
  • 2013-11-05
  • 1970-01-01
  • 2020-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多