我一直在学习 Elm 语言,非常喜欢这门语言。现在,我正在考虑编写一个电子表格应用程序,但是我不知道它的结构应该如何。
假设我们有三个单元格:A、B 和 C。
如果我在单元格 A 中输入 4
,并在单元格 B 中输入 =A
,那么我如何让单元格 B 总是等于单元格 A 呢?如果我接着在单元格 C 中输入 =A+B
,那么它能够求值为 8
,并且当 A 或 B 发生更改时也能更新吗?
不确定如何利用信号来实现这种动态行为。
敬礼,Oskar
我一直在学习 Elm 语言,非常喜欢这门语言。现在,我正在考虑编写一个电子表格应用程序,但是我不知道它的结构应该如何。
假设我们有三个单元格:A、B 和 C。
如果我在单元格 A 中输入 4
,并在单元格 B 中输入 =A
,那么我如何让单元格 B 总是等于单元格 A 呢?如果我接着在单元格 C 中输入 =A+B
,那么它能够求值为 8
,并且当 A 或 B 发生更改时也能更新吗?
不确定如何利用信号来实现这种动态行为。
敬礼,Oskar
首先,您需要决定如何表示您的电子表格网格。如果您来自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)
别名化,那可能也会有所帮助。我还假设你的电子表格中只包含浮点数。parse
和 eval
。parse : String -> Maybe Expr -- Result can also work
eval : Spreadsheet -> Grid Float
evalOne : Expr -> Spreadsheet -> Maybe Float