haskell-功能编程范例是否有可视化建模语言或样式?

UML是旨在以OO语言编写的软件建模的标准,并且与Java紧密相连。 仍然可以将其用于建模要以功能编程范例编写的软件吗? 给定嵌入式视觉元素,哪些图将变得有用?

是否有针对函数式编程的建模语言,更具体地说是Haskell? 您会建议使用哪些工具来绘制图表?

由OP编辑,2009年9月2日:

我正在寻找的是代码中最直观,最轻巧的表示。 易于理解的图表,可视化模型不一定针对其他程序员。 我将很快在Haskell中开发游戏,但是由于该项目是为我的毕业总结工作而设计的,因此我需要介绍所提议解决方案的某种形式化形式。 我想知道是否有等效于UML + Java的标准,但Haskell除外。我应该只坚持情节提要,书面说明,非形式化的图表(一些类似于流程图的浅图像),非形式化的用例描述吗?

由jcolebrand编辑,2012年6月21日:

请注意,提问者最初想要一个视觉隐喻,现在已经有三年了,我们正在寻找更多/更好的工具。 最初的答案都没有真正解决“视觉隐喻设计工具”的概念,因此……这就是新的赏金所希望提供的。

11个解决方案
43 votes

我相信Haskell的建模语言称为“数学”。 它经常在学校里教。

John Millikin answered 2020-08-05T04:29:02Z
30 votes

是的,Haskell有广泛使用的建模/规范语言/技术。它们不是视觉的。

在Haskell中,类型给出了部分说明。有时,此规范会完全确定含义/结果,同时保留各种实现选择。除了在Haskell之外,还可以使用具有依赖类型的语言,例如Agda&Coq(在其他语言中),类型作为完整的规范更为有用。

在类型不够的地方,添加正式的规范,通常采用简单的功能形式。(因此,我相信,Haskell选择的建模语言是Haskell本身或“数学”的答案。)通过这种形式,您可以提供为清晰和简单而优化的功能定义,而并非为效率而优化。该定义甚至可能涉及无争议的操作,例如无限域上的函数相等。然后,逐步将规范转换为可有效计算的功能程序的形式。每个步骤都保留了语义(表示),因此,保证最终形式(“实现”)在语义上与原始形式(“规范”)等效。您会看到此过程以各种名称引用,包括“程序转换”,“程序派生”和“程序计算”。

典型推导中的步骤主要是“等式推理”的应用,并增加了一些数学归纳(和共归纳)的应用。能够执行这种简单而有用的推理首先是功能编程语言的主要动机,而它们的有效性归功于“真正的功能编程”的“象征性”性质。(术语“象征性”和“真正具有功能性”摘自Peter Landin的开创性论文《未来700种编程语言》。)因此,对于纯函数式编程的呼声曾经是“对方程式推理有益的”,尽管这些天我很少听到这种描述。在Haskell中,符号表示对应于IO以外的类型以及依赖于Image的类型(例如Monoid)。虽然指示性/非Functor类型对于正确的方程式推理是好的,但是Applicative /非指示性类型被设计为对于不正确的方程式推理是不利的。

我在Haskell的工作中经常使用的一种特定于规格的衍生形式,就是所谓的“语义类型类态态”(TCM)。此处的想法是为数据类型提供语义/解释,然后使用TCM原理通过类型类实例确定(通常唯一)大多数或所有类型功能的含义。例如,我说Image类型的含义是2D空间中的函数。然后,TCM原理告诉我MonoidFunctorApplicativeMonadContrafunctorComonad实例的含义,与这些功能实例相对应。在具有非常简洁和引人注目的规格的图像上,这是很多有用的功能!(该规范是语义函数以及语义TCM原理必须适用的标准类型类的列表。)但是,我在表示图像方面有很大的自由度,语义TCM原理消除了抽象泄漏。如果您想了解一些实际应用此原理的示例,请查看具有类型类态射态的Denotational设计论文。

Conal answered 2020-08-05T04:29:45Z
21 votes

我们使用定理证明者进行形式建模(带有验证),例如Isabelle或Coq。 有时,在派生“低级” Haskell实现之前,我们会使用领域特定的语言(例如Cryptol)进行高级设计。

通常,我们只使用Haskell作为建模语言,然后通过重写来得出实际的实现。

QuickCheck属性以及类型和模块分解在设计文档中也很重要。

Don Stewart answered 2020-08-05T04:28:43Z
13 votes

是的,Haskell。

我得到的印象是,使用功能语言的程序员在考虑设计时并不需要简化选择的语言,这是一种查看UML为您服务的方式(而不是glib)。

Ori Pessach answered 2020-08-05T04:30:10Z
6 votes

我已经观看了一些视频采访,并阅读了一些采访,例如Erik Meijer和simon Peyton-Jones。 在建模和理解问题域时,它们似乎使用类型签名,尤其是函数签名。

顺序图(UML)可能与功能的组成有关。静态类图(UML)可能与类型签名有关。

fsl answered 2020-08-05T04:30:35Z
5 votes

在Haskell中,您可以按类型建模。

只是从编写没有任何实现的函数,类和数据签名开始,然后尝试使类型合适。 下一步是QuickCheck。

例如。 模拟排序:

class Ord a where
    compare :: a -> a -> Ordering

sort :: Ord a => [a] -> [a]
sort = undefined

然后测试

prop_preservesLength l = (length l) == (length $ sort l)
...

最后实现...

Dario answered 2020-08-05T04:31:12Z
4 votes

尽管不建议使用(因为似乎无法下载),但HOPS系统将术语图可视化,这通常是功能程序的便捷表示形式。

HOPS screenshot

它也可以被认为是一种设计工具,因为它支持对程序进行文档编制和构建。 我相信,如果您愿意的话,它也可以逐步重写条款,以便您可以看到它们的展开。

不幸的是,我相信它不再被积极开发。

ScottWest answered 2020-08-05T04:31:41Z
2 votes

我知道我参加晚会很晚,但是我仍然会给出答案,以防有人觉得有用。

我想我会使用SADT / IDEF0之类的系统方法。

  • [HTTPS://恩.Wikipedia.org/wiki/function_model]
  • [HTTPS://恩.Wikipedia.org/wiki/structured_analysis_安定_design_technique]

可以使用在Linux,Windows和MacOS上都可以使用的Dia程序制作此类图表。

Guillaume Ponce answered 2020-08-05T04:32:20Z
2 votes

您可以按照Hideki John Reekie的“实时信号处理:数据流,可视化和功能编程”中的描述进行数据流处理网络模型。

例如,类似(Haskell)的代码:

fact n | n == 0    = 1
       | otherwise = n * fact (n - 1)

视觉表示为:

enter image description here

Luxspes answered 2020-08-05T04:32:51Z
1 votes

用数学建模Haskell的意义何在? 我认为Haskell的全部要点是它与数学密切相关,以至于数学家可以选择并使用它。 您为什么要将语言翻译成自身?

当使用另一种功能编程语言(f#)时,我在白板上使用描述大型块的图,然后使用UML和类以OO方式对系统进行建模。 f#的构建块中有一个轻微的未命中匹配(将类拆分为作用于它们的数据结构和函数)。 但是从业务角度来看,它确实有效。 我想提醒一下,该问题是面向业务/ Web的,并且不知道该技术在多一些财务方面的效果如何。 我想我可能会将函数捕获为没有状态的对象,它们应该很好地配合在一起。

这完全取决于您工作的领域。

WeNeedAnswers answered 2020-08-05T04:33:21Z
0 votes

我使用USL-通用系统语言。 我正在学习Erlang,我认为这很合适。

太糟糕了,文档非常有限,没有人使用它。更多信息在这里。

GxFlint answered 2020-08-05T04:33:45Z
translate from https://stackoverflow.com:/questions/1364237/is-there-a-visual-modeling-language-or-style-for-the-functional-programming-para