你如何在 Elm 中构建电子表格应用程序?

6

我一直在学习 Elm 语言,非常喜欢这门语言。现在,我正在考虑编写一个电子表格应用程序,但是我不知道它的结构应该如何。

假设我们有三个单元格:A、B 和 C。 如果我在单元格 A 中输入 4,并在单元格 B 中输入 =A,那么我如何让单元格 B 总是等于单元格 A 呢?如果我接着在单元格 C 中输入 =A+B,那么它能够求值为 8,并且当 A 或 B 发生更改时也能更新吗? 不确定如何利用信号来实现这种动态行为。 敬礼,Oskar

1个回答

5

首先,您需要决定如何表示您的电子表格网格。如果您来自C背景,可能希望使用2D数组,但我发现在Elm中使用字典实际上更好。因此,您可以定义type alias Grid a = Dict (Int, Int) a

至于a,每个单元格保存什么内容...这是定义特定领域语言的机会。因此,像这样的东西:

type Expr = Lit Float | Ref (Int, Int) | Op2 (Float -> Float -> Float) Expr Expr

这意味着表达式可以是一个字面的浮点数、另一个单元格位置的引用或操作符。操作符可以是任何作用于两个浮点数和两个递归计算的其他表达式的函数。根据你的需要,你可以为每个操作定义特定的标记,如Plus Expr Expr | Times Expr Expr,也可以为不同阶数的操作添加额外的 opN 标记(如 negate)。
因此,你可能需要定义 type alias Spreadsheet = Grid Expr,如果你想将 (Int, Int) 别名化,那可能也会有所帮助。我还假设你的电子表格中只包含浮点数。
现在你需要编写将字符串转换为表达式和将表达式反向转换的函数。这些函数的传统名称为 parseeval
parse : String -> Maybe Expr -- Result can also work
eval : Spreadsheet -> Grid Float
evalOne : Expr -> Spreadsheet -> Maybe Float

解析会有些棘手;String 模块 是你的朋友。评估将涉及通过电子表格追踪引用并递归地填充结果。起初,您将想要忽略捕获无限循环的可能性。此外,这只是一个草图,如果您发现不同的类型签名更有效,请使用它们。
至于视图,我建议先从只读开始,以便您可以验证硬编码电子表格是否正确评估。然后,您可以担心编辑,在这种情况下,您只需重新运行解析器和评估器,并获得新的电子表格以呈现。它应该可以工作,因为电子表格除了每个单元格的内容之外没有状态。(最小化重新计算的工作是您可以扩展此方式的众多不同方式之一。) 如果您正在使用 elm-html,表元素应该可以正常工作。
希望这能为您确定正确的方向。这是一个雄心勃勃的项目,我希望在您完成时能看到它(将其发布到邮件列表)。祝你好运!

感谢您非常详细的回答。期待尝试一下。如果有所作为,一定会发布的 :) - oskbor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接