是否有function性编程范例的可视化build模语言或风格?
UML是一个旨在对将用OO语言编写的软件进行build模的标准,并与Java结合在一起。 但是,它是否可能被用来模拟意在编写function性编程范例的软件呢? 考虑到embedded式视觉元素,哪些图将变得有用?
有没有一种针对函数式编程的build模语言,更具体的说是Haskell? 你会推荐什么工具来组合图表?
OP编辑于2009年9月2日:
我正在寻找的是代码中最直观,最清晰的代码。 易于遵循图表,视觉模型不一定针对其他程序员。 我很快就会在Haskell开发一个游戏,但是因为这个项目是为了我的gradle结束工作,所以我需要介绍一些正式的解决scheme。 我想知道是否有相当于UML + Java标准,但对于Haskell。 我应该坚持使用故事板,书面描述,非forms化的图表(一些浅stream程图像),非forms化的用例描述吗?
2012年6月21日由jcolebrand编辑:
请注意,提问者最初想要一个可视的隐喻,现在我们已经有三年了,我们正在寻找更多/更好的工具。 没有一个原始的答案真的解决了“视觉隐喻devise工具”的概念,所以…这是新的赏金正在寻求提供。
我们使用定理certificate来做formsbuild模(有validation),比如Isabelle或Coq。 有时我们使用领域特定的语言(如Cryptol)来进行高层devise,然后才能派生出“低层次”的Haskell实现。
通常我们只是使用Haskell作为build模语言,并通过重写来导出实际的实现。
QuickCheck属性也会在devise文档中发挥作用,同时还包括types和模块分解。
我相信Haskell的build模语言被称为“ math ”。 这经常在学校教授。
是的,Haskell有广泛使用的build模/规范语言/技术。 他们不是视觉的。
在Haskell中,types给出了部分规范。 有时,这个规范完全决定了意义/结果,同时留下各种实现select。 除了Haskell之外,对于依赖types的语言,如Agda&Coq(等等),types作为一个完整的规范更为有用。
在types不够的地方,添加一些forms化的规范,这些规范往往采取简单的functionforms。 (因此,我相信,Haskell的selectbuild模语言的答案是Haskell本身或“math”)。在这种forms中,您给出了一个function性定义,该定义为了清晰和简单而优化,而不是为了效率。 定义甚至可能涉及无法计算的操作,如无限域上的函数平等。 然后,逐步将规范转换为高效可计算function程序的forms。 每一步都保留了语义(表示),所以最终forms(“实现”)保证在语义上等同于原始forms(“规范”)。 您将看到以各种名称引用的过程,包括“程序转换”,“程序派生”和“程序计算”。
典型推导中的步骤主要是“等式推理”的应用,增加了几个math归纳(和共同归纳)的应用。 能够执行如此简单而有用的推理,首先是函数式编程语言的主要动机,并且它们的有效性在于“真正函数式编程”的“外延”性质。 (术语“外延”和“真正的function”来自Peter Landin的开创性论文“接下来的700种编程语言”) 。因此,纯函数式编程的号召力曾经是“有利于等式推理”,尽pipe我没有听到这种描述这几天几乎一样多。 在Haskell中,符号对应于IO
以外的types以及依赖于IO
types(如STM
)。 虽然指称/非IO
types对于正确的等式推理是有利的,但IO
/非指称types被devise为对于不正确的等式推理是不利的。
我在Haskell工作中尽可能经常使用的特定版本的衍生规范就是我所说的“语义types态射”(TCMs)。 这个想法是为数据types提供语义/解释,然后使用TCM原理通过types实例确定(通常是唯一的)大部分或全部typesfunction的含义。 例如,我说Image
types的含义是作为二维空间的函数。 中医原则然后告诉我Monoid
, Functor
, Applicative
, Monad
, Contrafunctor
和Comonad
实例的Comonad
,对应于这些函数实例。 这是非常简洁和引人注目的规格图像上的很多有用的function! (规范是语义function加上语义TCM原则必须遵守的标准types的列表)。然而,我有如何表示图像的巨大自由,语义TCM原理消除了抽象泄漏。 如果你想看到这个原理的一些例子,请参考types态射论文的指称devise 。
是的,Haskell。
我觉得使用函数式语言的程序员在思考他们的devise时并不觉得需要简化他们的select语言,这是查看UML为你做什么的一种(比较灵活的方式)。
我已经看了一些电视采访,并阅读了一些采访,如埃里克·梅厄尔和西蒙·佩顿琼斯。 在build模和理解问题域时,似乎使用types签名,特别是函数签名。
序列图(UML)可能与函数的组成有关。 静态类图(UML)可能与types签名有关。
在Haskell中,您按types进行build模。
刚开始写你的函数,类和数据签名没有任何实现,并尝试使types适合。 下一步是QuickCheck。
比如模拟一种sorting:
class Ord a where compare :: a -> a -> Ordering sort :: Ord a => [a] -> [a] sort = undefined
然后testing
prop_preservesLength l = (length l) == (length $ sort l) ...
最后执行…
虽然不是build议使用(因为它似乎不可用于下载),但HOPS系统可视化术语图,这往往是一个方便的function程序的代表。
它也可以被认为是一个devise工具,因为它支持logging和构build它们; 我相信如果你愿意的话,也可以通过重写术语,这样你可以看到它们展开 。
不幸的是,我相信它不再积极发展。
用Mathsbuild模Haskell会有什么意义? 我认为哈斯克尔的重点在于它与math的关系如此之密切,以至于math家们可以拿起它来运行它。 你为什么要翻译一种语言?
当使用另一种函数式编程语言(f#)时,我使用描述大块的白板上的图表,然后使用类以UO的方式使用UMLbuild模系统。 在f#中的构build块中存在一个小小的匹配错误(将这些类拆分为对其起作用的数据结构和函数)。 但从商业angular度来看,这是一种享受。 我会补充说,问题是商业/networking导向,不知道这种技术将如何更好的财务工作。 我认为我可能将这些function作为没有状态的对象来捕捉,而且应该很好地适应。
这一切都取决于你的工作领域。
我意识到自己迟到了,但是我仍然会给出答案,以防有人觉得有用。
我想我会select像SADT / IDEF0这样的系统化的方法。
- https://en.wikipedia.org/wiki/Function_model
- https://en.wikipedia.org/wiki/Structured_Analysis_and_Design_Technique
这样的图表可以在Linux,Windows和MacOS上使用的Dia程序来完成。
您可以使用数据stream过程networking模型,如“ 实时信号处理:数据stream,可视化和函数式编程”(由Hideki John Reekie
例如像(Haskell)这样的代码:
fact n | n == 0 = 1 | otherwise = n * fact (n - 1)
视觉表示将是:
我使用USL – 通用系统语言。 我正在学习Erlang,我认为这是一个完美的select。
太糟糕了,文档是非常有限的,没有人使用它。 更多信息在这里 。