2015-11-06 16 views
6

私はelmを見てきました。私はスプレッドシートアプリケーションをやろうと考えていましたが、どうやって構造化されているのか頭を包み込むことはできません。elmでスプレッドシートアプリをどのように構築しますか?

3つのセルがあるとします。 A、B、C セルAに4、セルBに=Aと入力すると、セルBは常にセルAと等しくなります。セルCに=A+Bと入力すれば、それは8と評価され、AまたはBが変更されたときにも更新されますか? レバーをどのように動かすかわからないこのような動的挙動のための信号。 よろしくおねがいしますOskar

答えて

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 

これは、式がリテラルの浮動小数点数、別のセルの場所への参照、または演算子のいずれかであることを意味します。演算子は、2つのfloat上の任意の関数と、再帰的に評価される2つの他の式とすることができます。あなたは何をしようとしているのかに応じて、Plus Expr Expr | Times Expr Exprのように各操作に特定のタグを定義することも、異なるarity(否定)の操作のために余分なopNタグを追加することもできます。

したがって、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 moduleはあなたの友人です。 Evalは、スプレッドシートを介して参照を追跡し、結果を再帰的に埋め込むことを含む。最初は、無限ループをキャッチする可能性を無視したいでしょう。また、これは単なるスケッチです。異なるタイプのシグネチャがうまく動作することがわかったら、それらを使用してください。

このビューでは、読み取り専用で始めるので、ハードコードされたスプレッドシートが正しく評価されていることを確認できます。次に、パーサーと評価ツールを再実行し、新しいスプレッドシートをレンダリングするというアイデアで、編集について心配することができます。スプレッドシートには各セルの内容以外の状態がないため、機能するはずです。 (再計算された作業を最小限に抑えることは、これを拡張できる多くの方法の1つです)。elm-htmlを使用している場合、テーブル要素はうまくいくはずです。

これは正しい方向にあなたをオフにすることを望みます。これは野心的なプロジェクトで、完了したらそれを見たいと思っています(mailing listに投稿してください)。がんばろう!

+0

非常に徹底的な回答をいただきありがとうございます。これを試すことを楽しみにしています。私が何か有用なものがあれば投稿するようにしましょう:) – oskbor

関連する問題