您将如何在elm中构建电子表格应用程序?

您将如何在elm中构建电子表格应用程序?,elm,Elm,我一直在看elm,我真的很喜欢学习这门语言。我一直在考虑做一个电子表格应用程序,但我不知道它是如何构造的 假设我们有三个细胞;A、 B和C。 如果我在单元格A中输入4,在单元格B中输入=A,我如何使单元格B始终等于单元格A?如果我随后在单元格C中输入=A+B,是否可以将其计算为8,并在A或B发生变化时进行更新? 不知道如何控制这种动态行为的信号。。 首先,您需要决定如何表示您的电子表格网格。如果您来自C语言背景,您可能希望使用2D数组,但我发现字典在Elm中实际上效果更好。因此,您可以定义类型a

我一直在看elm,我真的很喜欢学习这门语言。我一直在考虑做一个电子表格应用程序,但我不知道它是如何构造的

假设我们有三个细胞;A、 B和C。 如果我在单元格A中输入
4
,在单元格B中输入
=A
,我如何使单元格B始终等于单元格A?如果我随后在单元格C中输入
=A+B
,是否可以将其计算为
8
,并在A或B发生变化时进行更新? 不知道如何控制这种动态行为的信号。。
首先,您需要决定如何表示您的电子表格网格。如果您来自C语言背景,您可能希望使用2D数组,但我发现字典在Elm中实际上效果更好。因此,您可以定义
类型alias Grid a=Dict(Int,Int)a

至于
a
,每个单元格所包含的内容。。。这是一个定义领域特定语言的机会。大概是

type Expr = Lit Float | Ref (Int, Int) | Op2 (Float -> Float -> Float) Expr Expr
这意味着表达式可以是文字浮点、对另一个单元格位置的引用,也可以是运算符。运算符可以是两个浮点数上的任何函数,也可以是递归计算的两个其他表达式。根据您的目的,您可以为每个操作定义特定的标记,如
加上Expr Expr |乘以Expr Expr
,或者您可以为不同的算术运算添加额外的opN标记(如否定)

因此,您可以定义
类型alias Spreadsheet=Grid Expr
,如果您想将
(Int,Int)
别名为某个对象,这可能也会有所帮助。我还假设你的电子表格中只需要浮动

现在需要函数将字符串转换为表达式并返回。这些函数的传统名称是
parse
eval

parse : String -> Maybe Expr -- Result can also work
eval : Spreadsheet -> Grid Float
evalOne : Expr -> Spreadsheet -> Maybe Float
解析将有点棘手;这是你的朋友。Eval将涉及通过电子表格追踪引用,并以递归方式填写结果。首先,您需要忽略捕捉无限循环的可能性。此外,这只是一个草图,如果您发现不同类型的签名效果更好,请使用它们

至于视图,我将从只读开始,这样您就可以验证硬编码的电子表格是否得到了正确的评估。然后,您可以担心编辑问题,其想法是您只需重新运行解析器和计算器,并获得一个新的电子表格进行渲染。它应该可以工作,因为电子表格除了每个单元格的内容之外没有其他状态。(最小化重新计算的工作是可以扩展此功能的许多不同方法之一。)如果使用elm html,表元素应该可以


希望这能让你走上正确的方向。这是一个雄心勃勃的项目,我很想看到它当你完成(张贴到网站)。祝你好运

谢谢你非常详尽的回答。期待着尝试这一点。如果我做了一些有用的事情,一定要发帖:)